繁体   English   中英

在R data.table中,如何将变量参数传递给表达式?

[英]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'(字符)无效

现在, v1v2都从其他程序作为字符变量传递,所以我不能这样做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


马太福音编辑:有一个微妙的原因paste0eval \\ 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"))快得多那个原因。 至少,那是应该发生的事情,如果没有,那么它可能是一个错误。 另一方面,如果正在动态构建许多查询并重复,则可能会进入paste0parse的时间。 一切都取决于。 设置verbose=TRUE应该打印出一条消息,告知j已经检测到哪些列,以便进行检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM