R:将函数参数传递给 sqldf

R: Passing function argument to sqldf

我见过类似的问题 here and example 5 here 但我无法让我的示例起作用。 我在 R 方面不是很有经验,所以也许这很愚蠢。 我只想有一个函数,参数是 sqldf

使用的列名

我的最佳猜测:

function1 <- function(x) {
    ranking_test <<- sqldf ('select $x from lat_lon_combo t1')
}

function1(t1.lat_lon)

结果

"Error in mget(words, envir, "any", NA, inherits = TRUE) : object 't1.lat_lon' not found"

虽然t1.lat_lon应该存在。 有什么想法吗?

常见错误。 列名称 t1.lat_lon 可能存在,但在您对 function1 的调用中,您引用了一个名为 变量 12=],不存在。

您有几个选项,为简单起见,我推荐第一个(字符串):

  1. 将其作为字符串传递,并使用pastesprintf形成查询字符串。如:

    library(sqldf)
    func1 <- function(x) {
        sqldf(sprintf("select %s from mtcars where cyl > 7", x))
    }
    func1("disp")
    
  2. 如果你真的必须引用它而不用引号,你可以做这个诡计,但在这种情况下这是不必要的复杂性(为了两个引号符号):

    func2 <- function(x) {
        sqldf(sprintf("select %s from mtcars where cyl > 7",
                      deparse(substitute(x))))
    }
    func2(disp)
    

    在执行类似 plot(disp ~ mpg, data = mtcars) 的操作时会使用(并且很有用)这种类型的取消引用(尽管这与公式略有不同)。在那些情况下,它以一些代码复杂性和间接性为代价增加了有用性。如果你不需要这个(并且,根据你的例子,它看起来不像你需要的),那么为了简单起见,我会避免这个。

顺便说一句:在这两种情况下,我 return 来自 sqldf 的值 return,我选择(并且我强烈要求)反对 副作用,就像你在你的函数中所做的那样。 Side effects 可能是理想的,但如果可以避免,我们认为可以提供更清晰和更可预测的功能。