R:将数据帧列表传递给 sqldf 函数

R: Passing a list of data frames to a sqldf function

我有一个包含一些数据框的列表

myList <- list("A"=A, "B"=B)

我需要将每个数据帧传递给一个函数,该函数将在通过 sql 查询进行内部处理后 return 另一个数据帧列表。

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 方法给出错误“$ operator is invalid for atomic vectors”。我该如何解决?

代码有两个主要问题:

  • 在 SQL 语句中 from 需要后跟数据框的 name 但代码试图传递数据框本身而不是它的名称

  • 输入数据帧位于 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))

给出与之前所示相同的结果。