sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-04 09:16:29 25 4
mua khóa gpt4 Nike

在我明显的天真中,我假设当有人调用 đánh giá 时并指定一个环境 ( envir ),则表达式 ( biểu thức ) 在该环境中计算。

然而 :-)

这按预期工作:

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

默认情况下, đánh giáhiện hữu parent.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);

这也按预期工作; xxxnnnhiện hữu newEnv 中定义环境,和 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传递给 đánh giá .

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

1 Câu trả lời

我不知道为什么 expression()在这种情况下不起作用。但是,如果您写 biểu thức,它会起作用。作为字符串并替换 expression(expr)Từ 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)

kết quả:
> 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
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com