R 在包中使用经过计算的调用包装data.table

R 在包中使用经过计算的调用包装data.table,r,expression,eval,environment,data.table,R,Expression,Eval,Environment,Data.table,我正试图围绕数据编写一个简单的包装。表用于拆分应用组合使用(如聚合,ddply等),以便从数据中获益。表的速度,但不使用其数据结构或语法。我试过以下方法 fold = function(df, by, ...) { library(data.table) dt = data.table(df) dt = dt[, eval(substitute(list(...))), by] df = as.data.frame(dt) return(df) } a

我正试图围绕
数据编写一个简单的包装。表
用于拆分应用组合使用(如
聚合
ddply
等),以便从
数据中获益。表
的速度,但不使用其数据结构或语法。我试过以下方法

fold = function(df, by, ...)
{
    library(data.table)
    dt = data.table(df)
    dt = dt[, eval(substitute(list(...))), by]
    df = as.data.frame(dt)
    return(df)
}

a = data.frame(x=c(1,1,1,2,2,2), y=runif(6))
b = fold(a, "x", y_min=min(y), y_max=max(y))
print(a)
print(b)
当我把它放到脚本和
source
it中时,它工作得很好,但是当我把这个函数放到一个包中,安装它并尝试使用它时,我得到了

Error in eval(expr, envir, enclos) : object 'y' not found
Calls: fold -> [ -> [.data.table -> [.data.frame -> eval -> eval

除了一般的尝试之外,我做错了什么?

以下评论,FAQ 6.9回答了这个问题:

常见问题解答6.9我创建了一个依赖于data.table的包。如何确保我的包是data.table感知的,以便从data.frame继承工作?
你不需要做任何特别的事情。只需将
数据包含在
导入:
依赖于:
fi 程序包描述文件的字段中即可

有关从
data.frame
继承如何保持与
[.data.frame
完全兼容的一些技术细节,请参见:


不确定,但可能值得检查您是否有
数据。表
在您的
列表中取决于:
列表?@Andrie:不,我没有,并且它在添加后确实有效。为什么
建议:
和在函数体中加载
数据。表
在这里起作用?没有看到好问题。因为在大多数
数据的顶部。表
函数是对
数据的调用。table:::cedta
(调用环境数据。table Aware)。这需要您专门依赖、导入或创建
。datatable.Aware=TRUE
。请看,您可能还想与@Hadley交谈,他也正在/正在从事类似的工作。