gpt4 book ai didi

r - 在 R 中,如何评估函数内特定环境中的表达式?

转载 作者:行者123 更新时间:2023-12-04 09:16:29 25 4
gpt4 key购买 nike

在我明显的天真中,我假设当有人调用 eval 时并指定一个环境 ( envir ),则表达式 ( expr ) 在该环境中计算。

然而 :-)

这按预期工作:

xx <- 10
nn <- 20
exprs <- binom.test(x=xx,n=nn)
eval(exprs);

默认情况下, evalparent.frame() 中评估,帮助显示 [t] 函数评估的父框架是调用函数的环境。

所以在上面的例子中,这是全局环境,实际上, xxnn被定义。到现在为止还挺好。

newEnv <- new.env();
assign('xxx', 10, envir = newEnv);
assign('nnn', 30, envir = newEnv);
exprs2 <- expression(binom.test(x=xxx,n=nnn));
eval(exprs2, envir=newEnv);

这也按预期工作; xxxnnnnewEnv 中定义环境,和 binom.test在那个环境中被评估。

现在我们将它包装在一个函数中(我正在尝试构建的那个 - 我正在使用 pwr 包构建它,但对于这个例子,我使用 binom.test 因为它是基础 R 并且它仍然没有工作 :-)

loopFunction <- function(expr,
...) {

### Get all 'dots' in a named list
arguments <- list(...);
argNames <- names(arguments);

if (any(length(tail(arguments, -2) > 1))) {
stop("Only the first two arguments may have length > 1!");
}

for (esIndex in seq_along(arguments[[1]])) {
for (pwrIndex in seq_along(arguments[[2]])) {
tempEnvironment <-
new.env();
assign(argNames[1], arguments[[1]][esIndex],
envir = tempEnvironment);
assign(argNames[2], arguments[[2]][pwrIndex],
envir = tempEnvironment);
if (length(arguments) > 2) {
for (i in 3:length(arguments)) {
assign(argNames[i], arguments[[i]],
envir = tempEnvironment);
}
}
print(argNames);
print(as.list(tempEnvironment));
print(ls(tempEnvironment));
print(get('x', envir=tempEnvironment));
print(get('n', envir=tempEnvironment));
return(eval(expr = expression(expr),
envir = tempEnvironment)$estimate);
}
}
}

运行此程序时,您将获得:

loopFunction(binom.test(x=x,n=n), x=c(10,20), n=c(30, 100));

#> [1] "x" "n"
#> $x
#> [1] 10
#>
#> $n
#> [1] 30
#>
#> [1] "n" "x"
#> [1] 10
#> [1] 30
#> Error in binom.test(x = x, n = n): object 'x' not found

所以,这个错误让我很难过。显然, xn存在于 tempEnvironment ;和 tempEnvironment传递给 eval .

为什么这突然不再起作用?这在函数内部的工作方式不同吗?我错过了一些明显的东西吗?

最佳答案

我不知道为什么 expression()在这种情况下不起作用。但是,如果您写 expr,它会起作用。作为字符串并替换 expression(expr)来自 parse(text=expr) :

loopFunction <- function(expr,
...) {

### Get all 'dots' in a named list
arguments <- list(...);
argNames <- names(arguments);

if (any(length(tail(arguments, -2) > 1))) {
stop("Only the first two arguments may have length > 1!");
}

for (esIndex in seq_along(arguments[[1]])) {
for (pwrIndex in seq_along(arguments[[2]])) {
tempEnvironment <-
new.env();
assign(argNames[1], arguments[[1]][esIndex],
envir = tempEnvironment);
assign(argNames[2], arguments[[2]][pwrIndex],
envir = tempEnvironment);
if (length(arguments) > 2) {
for (i in 3:length(arguments)) {
assign(argNames[i], arguments[[i]],
envir = tempEnvironment);
}
}
print(argNames);
print(as.list(tempEnvironment));
print(ls(tempEnvironment));
print(get('x', envir=tempEnvironment));
print(get('n', envir=tempEnvironment));
return(eval(expr=parse(text=expr), envir =tempEnvironment)$estimate)
}
}
}

loopFunction("binom.test(x, n)", x=10, n=30)

结果:
> loopFunction("binom.test(x, n)", x=10, n=30)
[1] "x" "n"
$`x`
[1] 10

$n
[1] 30

[1] "n" "x"
[1] 10
[1] 30
probability of success
0.3333333

关于r - 在 R 中,如何评估函数内特定环境中的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56038299/

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