R:EXPR中的函数+开关语句必须是长度为1的向量

时间:2015-08-10 12:08:50

标签: r

在下面的代码中,数据框offshore_Sites已经存在并包含大约1000条记录。我正在构建一个函数,所以我可以将它重用于我拥有的所有其他数据帧。

数据框是从SQL Server获得的。目前我只有一个离岸的一个,但其他的将以同样的方式生产。

这个想法是调用这个函数,里面有一个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)

然而,当我运行它时,我收到错误:

  

开关出错(dataframe,offshore_Sites = {:
        EXPR必须是长度为1的向量

有谁知道发生了什么?

1 个答案:

答案 0 :(得分:0)

今天我有了一些灵感,我发现了问题所在。该函数需要两个变量,即数据帧名称和数据帧本身。

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")

感谢所有评论:)