【发布时间】:2015-08-16 13:20:01
【问题描述】:
我有一个(大)data.table。我想对它的许多专栏做同样的事情。说,
dt <- data.table( ltr = letters[1:5] )
func <- function( dt ){
cols <- colnames( dt ) # Columns to apply op to
dt[ , (cols) := lapply( .SD, toupper ), .SDcols = cols ]
return( dt )
}
函数func 将所有列的字符转换为大写。我试试
func( dt )
我得到了错误
Error in `:=`((cols), lapply(.SD, toupper)) :
Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
我仍然不确定导致错误的原因并已阅读 help(":=")、常见问题解答和其他一些 (SO) 资源。有什么帮助吗?
注意:我应该提供有关上下文的更多详细信息。 func 是一个写在包中的函数。这一切都不同
【问题讨论】:
-
我也没有收到任何错误。不过,您需要注意,您在全局环境中的
dt正在使用:=通过引用进行更新。所以不需要return( dt )。我还建议探索set,因为它更适合此类操作。 -
您是否在包中使用此功能?如果是这样,make sure your package is data.table aware..
-
选项 2 似乎可以解决问题。我将 roxygen2 用于文档。
data.table列在DESCRIPTION 的Imports字段中,但import(data.table)未显示在NAMESPACE 中。可悲的是,我阅读并支持了该答案:(谢谢@Arun。如果您提出答案,我会接受。 -
很高兴它已解决。您可以自己回答,并接受它。
-
(@DavidArenburg :) 好的:回去。)这个答案的最后一行(由 Arun 建议)说明了
setDavid 提到的用法:stackoverflow.com/a/16846530/1191259
标签: r reference data.table