我有一个包含一些数据框的列表
myList <- list("A"=A, "B"=B)
我需要将每个数据帧传递给一个函数,该函数在通过sql查询进行内部处理后将返回另一个数据帧列表。
myFunction <- function(x){
inner.processing.1 <- sqldf(sprintf("SELECT
// do something
FROM '%s'", x$A))
inner.processing.2 <- sqldf(sprintf("SELECT
// do something
FROM '%s'", x$B))
inner.list <- list("C"=inner.processing.1,"D"=inner.processing.2)
return(inner.list)
}
myFunction(myList)
x $ A,x $ B方法给出错误&#34; $运算符对原子向量&#34;无效。我该如何解决?
答案 0 :(得分:2)
代码有两个主要问题:
在SQL语句from
中需要跟随数据框的名称,但代码试图传递数据框本身而不是其名称
输入数据框位于sqldf
无法访问的列表中,除非它们放在环境中并且sqldf
语句被告知要查看哪个环境
使用内置数据框BOD
作为示例:
f <- function(L) { # L is named list of 2 data frames
e <- list2env(L)
list(
C = fn$sqldf("select * from `names(L)[1]`", envir = e),
D = fn$sqldf("select * from `names(L)[2]`", envir = e)
)
}
library(sqldf)
f(list(A = BOD, B = 2 * BOD))
,并提供:
$C
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
$D
Time demand
1 2 16.6
2 4 20.6
3 6 38.0
4 8 32.0
5 10 31.2
6 14 39.6
注意:以上假设您只知道运行时数据框的名称。如果您在编写函数时知道它们,那么它们可以简单地进行硬编码:
f2 <- function(L) { # L is named list of 2 data frames
e <- list2env(L)
list(
C = sqldf("select * from A", envir = e),
D = sqldf("select * from B", envir = e)
)
}
library(sqldf)
f2(list(A = BOD, B = 2 * BOD))
给出与前面所示相同的结果。