gpt4 book ai didi

r - data.table 的包装函数在本地环境中不起作用

转载 作者:行者123 更新时间:2023-12-04 21:55:01 26 4
gpt4 key购买 nike

考虑以下函数:

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

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

> 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 的子集一起使用?

我的 session 信息:

> 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

最佳答案

它不起作用是有道理的,因为 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

关于r - data.table 的包装函数在本地环境中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com