【问题标题】:data.table assignment by reference within function [duplicate]函数内通过引用分配data.table [重复]
【发布时间】: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 建议)说明了 set David 提到的用法:stackoverflow.com/a/16846530/1191259

标签: r reference data.table


【解决方案1】:

简短的回答是make sure the package is data.table aware。请参阅@Arun 的评论。

请注意,使用devtools::use_package( "data.table", pkg = "." ) 将添加到DESCRIPTION 中的Imports 字段,但不会在NAMESPACE 中显式添加import( data.table )。因此,在 Depends 字段中包含 data.table(这是 Matthew 在他的帖子中概述的第一个选项)可能更万无一失。

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 2018-04-19
    • 2019-03-21
    • 2021-12-28
    • 2019-10-20
    • 2015-07-11
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多