【问题标题】:Wrapper function for data.table does not work in local environmentdata.table 的包装函数在本地环境中不起作用
【发布时间】:2014-08-20 23:42:15
【问题描述】:

考虑以下函数:

test <- function(x,...) {
  # in practical case, it does more
  x[...]
}

那么调用 subsetting 的包装函数在本地环境中不起作用。

> library(data.table)
> m <- data.table(x=1:3,key="x")
> m[J(1)]
   x
1: 1
> local({i <- 1; m[J(i)]})
   x
1: 1
> local({i <- 1; test(m, J(i))})
Error in eval(expr, envir, enclos) : object 'i' not found
> local({i <- 1; test(m, i)})
Error in eval(expr, envir, enclos) : object 'i' not found

这可能是因为test() 没有尝试在该环境中查找符号。但是,如果我将 data.table 更改为 data.frame 并运行最后一行,它工作正常。

> m <- data.frame(x=1:3)
> local({i <- 1; test(m, i)})
  x
1 1
2 2
3 3

如何修改test() 使其可以与...data.table 的子集一起使用?

我的会话信息:

> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.2

loaded via a namespace (and not attached):
[1] plyr_1.8.1    Rcpp_0.11.2   reshape2_1.4  stringr_0.6.2 tools_3.1.1  

【问题讨论】:

  • 在任一设置中使用test[ 时,我都没有收到错误消息。在 R 3.1.0 中使用 data.table_1.9.2。
  • @BondedDust,我在 R 3.1.1 中使用 data.table_1.9.2
  • 写维护者​​。
  • 嗯,...... 9 小时......你是一个相当不耐烦的男孩,不是吗?
  • [.data.frame[.data.table 的工作方式在实践方面有很大不同(data.table 中使用非标准评估),并且使用声明缺失的参数是 @987654336 之间的区别@ 用于 data.frames。所需要的将是一些能够明智地处理这些情况的方法(对于data.framedata.table 可能有不同的方法。你认为data.frame 工作正常的观点是正确的,因为它不会返回错误,但是它不会返回相同的过滤。

标签: r data.table environment subset


【解决方案1】:

它不起作用是有道理的,因为 data.table 的 [...] 采用在 parent.frame 中评估的表达式。所以在这种情况下,J(i) 将在test() 的环境中进行评估,因为这是调用它的地方。由于test()是在全局环境中定义的,所以默认在全局环境中搜索test()中没有的任何变量。 test() 函数与您创建的本地环境并不真正相关。您可以更改要在其 parent.frame 中评估的 test() 函数。例如

test <- function(x,...) {
    cc <- match.call()
    cc[[1]] <- quote(`[`)
    names(cc)[2]<-"" #make data.frame happy
    eval.parent(cc)
}

测试数据

library(data.table)
m <- data.table(x=1:3,key="x")    
n <- data.frame(x=1:3)

现在是函数

local({i <- 1; m[J(i)]})
#    x
# 1: 1

local({i <- 1; test(m, J(i))})
#    x
# 1: 1

local({i <- 1; test(n, i)})
#   x
# 1 1
# 2 2
# 3 3

i<-2
test(m, J(i))
#    x
# 1: 2

【讨论】:

  • 对环境问题的精彩描述。
猜你喜欢
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多