我已经看到类似的问题here和example 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。 有什么想法吗?
答案 0 :(得分:0)
常见错误。 列名称 t1.lat_lon
可能存在,但在您对function1
的调用中,您引用的是名为t1.lat_lon
的变量,不存在。
你有几个选择,为简单起见,我推荐第一个(字符串):
将其作为字符串传递,并使用paste
或sprintf
来形成查询字符串。如:
library(sqldf)
func1 <- function(x) {
sqldf(sprintf("select %s from mtcars where cyl > 7", x))
}
func1("disp")
如果你真的必须引用它而没有引号,你就可以做到这一点,但在这种情况下它是不必要的复杂性(为了两个引号符号):
func2 <- function(x) {
sqldf(sprintf("select %s from mtcars where cyl > 7",
deparse(substitute(x))))
}
func2(disp)
这种类型的解除引用在执行plot(disp ~ mpg, data = mtcars)
之类的操作时使用(并且很有用)(尽管这样做的公式甚至略有不同)。在这些情况下,它会以牺牲一些代码复杂性和间接性为代价来增加实用性。如果你不需要这个(并且,基于你的例子,它看起来不像你那样),那么为了简单起见,我会避免这种情况。
BTW:在这两种情况下,我都会返回sqldf
返回的值,我选择(我强烈要求) 反对 副作用,就像你做的那样在你的功能。 Side effects是可取的,但如果可以避免,则可以提供更清晰,更可预测的功能。