[英]In R data.table, how do I pass variable parameters to an expression?
我遇到了一个关于data.table
的小R问题。 非常感谢您的帮助。 我该怎么做呢:
getResult <- function(dt, expr, gby) {
e <- substitute(expr)
b <- substitute(gby)
return(dt[,eval(e),by=b])
}
v1 <- "Sepal.Length"
v2 <- "Species"
dt <- data.table(iris)
rDT <- getResult(dt, sum(v1, na.rm=TRUE), v2)
我收到以下错误:
sum中的错误(v1,na.rm = TRUE):参数的'type'(字符)无效
现在, v1
和v2
都从其他程序作为字符变量传递,所以我不能这样做v1<- quote(Sepal.Length)
似乎工作。
在评论中替代flodel的答案可能是
e <- parse(text = paste0("sum(", v1, ", na.rm = TRUE)"))
b <- parse(text = v2)
rDT2 <- dt[, eval(e), by = eval(b)]
# b V1
# [1,] setosa 250.3
# [2,] versicolor 296.8
# [3,] virginica 329.4
编辑:
把它放到一个函数中,
getResult <- function(dt, expr, gby){
return(dt[, eval(expr), by = eval(gby)])
}
(dtR <- getResult(dt = dt, expr = e, gby = b))
# gives the same result as above
马太福音编辑:有一个微妙的原因paste0
和eval
\\ quote
方法可以比快get
在某些情况下,太。 分组的原因之一是data.table
检查j
以查看它使用哪些列,然后仅对那些使用的列进行子集(FAQ 1.12和3.1)。 它使用base::all.vars(j)
来做到这一点。 当在j
使用get()
,正在使用的列对all.vars
是隐藏的,而data.table
会回退到所有列的子集,以防j
表达式需要它们(就像在j
使用.SD
符号时一样)其中添加了.SDcols
)。 如果无论如何都使用了所有列,那么它没有区别,但如果DT
是1e7x100,则分组j=sum(V1)
应该比分组j=sum(get("V1"))
快得多那个原因。 至少,那是应该发生的事情,如果没有,那么它可能是一个错误。 另一方面,如果正在动态构建许多查询并重复,则可能会进入paste0
和parse
的时间。 一切都取决于。 设置verbose=TRUE
应该打印出一条消息,告知j
已经检测到哪些列,以便进行检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.