R:将函数参数传递给sqldf

时间:2016-07-17 12:44:36

标签: r sqldf

我已经看到类似的问题hereexample 5 here,但我无法让我的榜样发挥作用。 我对R不是很有经验,所以也许是愚蠢的事情。 我只想要一个函数,该参数是sqldf

使用的列名

我最好的猜测:

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

function1(t1.lat_lon)

结果

  

&#34; mget中出错(words,envir,&#34; any&#34;,NA,inherits = TRUE):object   &#39; t1.lat_lon&#39;找不到&#34;

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

1 个答案:

答案 0 :(得分:0)

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

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

  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)之类的操作时使用(并且很有用)(尽管这样做的公式甚至略有不同)。在这些情况下,它会以牺牲一些代码复杂性和间接性为代价来增加实用性。如果你不需要这个(并且,基于你的例子,它看起来不像你那样),那么为了简单起见,我会避免这种情况。

  3. BTW:在这两种情况下,我都会返回sqldf返回的值,我选择(我强烈要求) 反对 副作用,就像你做的那样在你的功能。 Side effects是可取的,但如果可以避免,则可以提供更清晰,更可预测的功能。