gpt4 book ai didi

r - 如何编写调用调用data.table的函数的函数?

转载 作者:行者123 更新时间:2023-12-03 13:32:32 25 4
gpt4 key购买 nike

data.table具有一些特殊的语法,需要使用该语法才能将表达式用作ij参数。

正如section 1.16 of the FAQs中很好地解释的那样,这对一个写函数如何接受参数并将参数传递到数据表有一些影响。

但是我不知道该如何提高这一水平。

这是一个例子。假设我想编写一个包装器函数foo(),对我的数据进行特定的摘要,然后编写另一个包装器plotfoo(),调用foo()并绘制结果:

library(data.table)


foo <- function(data, by){
by <- substitute(by)
data[, .N, by=list(eval(by))]
}

DT <- data.table(mtcars)
foo(DT, gear)


好的,这行得通,因为我得到了列表结果:

   by  N
1: 4 12
2: 3 15
3: 5 5




现在,我在编写 plotfoo()时尝试达到相同的效果,但我失败了:

plotfoo <- function(data, by){
by <- substitute(by)
foo(data, eval(by))
}
plotfoo(DT, gear)


但是这次我收到一条错误消息:

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?




好的,所以 eval()引起了问题。让我们删除它:

plotfoo <- function(data, by){
by <- substitute(by)
foo(data, by)
}
plotfoo(DT, gear)


哦,不,我收到新的错误消息:

Error in `[.data.table`(data, , .N, by = list(eval(by))) : 
column or expression 1 of 'by' or 'keyby' is type symbol. Do not quote column names. Useage: DT[,sum(colC),by=list(colA,month(colB))]




而这就是我坚持的地方。

问题:如何编写调用调用data.table的函数的函数?

最佳答案

这将起作用:

plotfoo <- function(data, by) {
by <- substitute(by)
do.call(foo, list(quote(data), by))
}

plotfoo(DT, gear)
# by N
# 1: 4 12
# 2: 3 15
# 3: 5 5


说明:

问题是您在 foo()中对 plotfoo()的调用看起来像以下之一:

foo(data, eval(by))
foo(data, by)


foo处理这些调用时,它会忠实地为第二个形式参数( substitute)的 by s获得 byeval(by)符号作为 by的值。但是您希望 by的值是 gear,就像在调用 foo(data, gear)中一样。

do.call()通过构造第二个参数的元素,然后构造它要计算的调用来解决此问题。结果,当您传递它 by时,它将在构造看起来(基本上)如下所示的调用之前将其评估为其值(符号 gear):

foo(data, gear)

关于r - 如何编写调用调用data.table的函数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14837902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com