【发布时间】:2015-03-14 20:57:46
【问题描述】:
使用R的data.table包,
这行得通:
instruction = "a = data.table(name=1:3, value=1:3, blah=1:3); a[,c('value', 'blah'):=NULL]"
eval(parse(text=instruction))
# name
#1: 1
#2: 2
#3: 3
这行得通:
myFunc = function(instruction) {
eval(parse(text=instruction))
}
myFunc(instruction)
# name
#1: 1
#2: 2
#3: 3
现在,将这个函数放入一个包中,加载它,然后尝试调用它。这不起作用:
myFuncInPackage(instruction)
#Error in `:=`(c("value", "blah"), NULL) :
# Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
为什么?
编辑:@Roland 指出在包 Depends 字段中添加 data.table 可以使其工作。但是,我认为这不是一个很好的解决方案,因为该包并不真正依赖、需要或使用 data.table。我只是希望能够将 data.table 与包一起使用。
此外,data.table 的所有其他内容在函数中都可以正常工作,只是 := 运算符不行。
所以我想一个后续问题可能是:我是否应该将 data.table 添加到我编写的每个包的 Depends 中,以便 data.tables 在该包的函数中按预期工作?这似乎不对...解决此问题的正确方法是什么?
【问题讨论】:
-
您是否遵循了FAQ 6.9 中的建议?此外,不鼓励使用
eval(parse())。 -
@Roland Add data.table to Depends 解决了它......但导致一个问题:我的包实际上并不依赖于 data.table;事实上,这完全不相关。在这个例子中,它只有一个函数,
myFunc——没有 data.table 任何东西。但它不能与 data.table 一起使用而不将其添加到 Depends... -
你的包有
eval(parse(text=instruction)),instruction可以是任何东西!在评估时,instruction要求的任何功能都必须可用;这应该在您的包裹的使用说明中指定。当instruction需要data.table中的函数时,您会看到这一点;在执行myFuncInPackage(instruction)之前加载'data.table'并查看它是否有效。 -
@Sergii Zaskaleta 不...我没有在我的函数中使用
:=。这是由用户在“指令”变量中传递的。它与包裹无关... -
@sheffien 你能检查一下你是否将
NAMESPACE文件更新为import(data.table)和DESCRIPTION更新为Imports: data.table?我最近遇到了同样的问题,只是因为NAMESPACE文件中缺少条目。
标签: r data.table colon-equals