1. ホーム
  2. r

[解決済み] Rの関数+Switch文。EXPR は長さ 1 のベクトルでなければならない

2022-02-09 20:06:13

質問

以下のコードでは、offshore_Sitesというデータフレームがすでに存在し、約1000件のレコードが含まれています。この関数を他のすべてのデータフレームに再利用できるようにするため、関数を作成しています。

データフレームはSQL Serverから取得します。現時点では offshore_Sites のみを取得していますが、他のデータフレームも同じように作成されます。

この関数は、内部にswitchステートメントを持ち、データフレームに応じて異なる変換を行うものです。offshore_Sitesの場合、例のようにいくつかのフィールドを連結する必要があります。

myStringConn <- "Driver=SQL Server;Server=SQL-SPATIAL;Database=AreasProt;Trusted_Connection=True;"
conn <- odbcDriverConnect(myStringConn)
offshore_Sites <- sqlQuery(conn, "select * from Offshore_Sites")

formatDataFrame <- function(dataframe) {
                              switch(dataframe, "offshore_Sites"  = {
                                offshore_sites <- as.data.table(offshore_Sites)
                                offshore_sites <- setnames(offshore_sites, 1:6, c("status","country","region","area","long","lat"))
                                offshore_sites <- unique(offshore_sites[, list(status,                                        
                                                                               country = paste(sort(unique(country)), collapse = ' & '),
                                                                               region = paste(sort(unique(region)), collapse = ' & '),
                                                                               area,
                                                                               long,
                                                                               lat), by = code])
                                })
                            }

formatDataFrame(offshore_Sites)

しかし、これを実行すると、エラーが発生します。

エラー in switch(dataframe, offshore_Sites = { :
EXPR は長さ 1 のベクトルでなければなりません

何が起こっているのか、誰か理解していますか?

解決方法は?

今日、ちょっとひらめいたのですが、問題の所在がなんとなくわかりました。この関数は2つの変数、データフレーム名とデータフレームそのものを必要とします。

myStringConn <- "Driver=SQL Server;Server=SQL-SPATIAL;Database=AreasProt;Trusted_Connection=True;"
conn <- odbcDriverConnect(myStringConn)
offshore_Sites <- sqlQuery(conn, "select * from Offshore_Sites")

formatDataFrame <- function(dataframe, dataframeName) {
                            switch(dataframeName, "offshore_Sites"  = {
                                offshore_sites <- as.data.table(dataframe)
                                offshore_sites <- setnames(offshore_sites, 1:6, c("status","country","region","area","long","lat"))
                                offshore_sites <- unique(offshore_sites[, list(status,                                        
                                                                               country = paste(sort(unique(country)), collapse = ' & '),
                                                                               region = paste(sort(unique(region)), collapse = ' & '),
                                                                               area,
                                                                               long,
                                                                               lat), by = code])
                                })
                            }

formatDataFrame(offshore_Sites, "Offshore_Sites")

たくさんのコメントありがとうございました :)