gpt4 book ai didi

R:使用作为对象传递的参数评估数据框中的表达式

转载 作者:行者123 更新时间:2023-12-04 10:31:51 25 4
gpt4 key购买 nike

我想编写一个函数来计算数据框中的表达式,但它使用的表达式可能包含也可能不包含用户定义的对象。
我认为神奇的词是“非标准评价”,但我现在还不太明白。

一个简单的例子(但对我来说是现实的):比如说,我想评估一个 lm()调用在数据框中找到的变量。

mydf <- data.frame(x=1:10, y=1:10)

这样做的函数可以写成如下:
f <- function(df, expr){
expr <- substitute(expr)
pf <- parent.frame()
eval(expr, df, pf)
}

这样我就可以使用以下命令得到我想要的东西。
f(mydf, lm(y~x))

# Call:
# lm(formula = y ~ x)
#
# Coefficients:
# (Intercept) x
# 1.12e-15 1.00e+00

好的。但是,在某些情况下,在调用 lm() 之前将模型方程保存在对象中会更方便。 .不幸的是,上面的函数不再这样做了。
fml <- y~x

f(mydf, lm(fml))
# Error in eval(expr, envir, enclos): object 'y' not found

有人可以解释为什么第二个电话不起作用吗?如何更改函数,使两个调用都能产生预期的结果? (期望=拟合模型)

干杯!

最佳答案

来自 ?lm , 回复 data争论:

If not found in data, the variables are taken from environment(formula)


在您的第一种情况下,公式是在您的 eval(expr, df, pf) 中创建的。调用,所以公式的环境是基于 df的环境.在第二种情况下,公式是在全局环境中创建的,这就是它不起作用的原因。
因为公式有自己的环境,所以在 NSE 中处理它们可能会很棘手。
你可以试试:
with(mydf,
{
print(lm(y~x))
fml <- y~x
print(lm(fml))
}
)
但这对您来说可能并不理想。如果不检查捕获的参数中的任何名称是否解析为公式,并重新分配它们的环境,您就会遇到一些麻烦。更糟糕的是,重新分配环境是否是正确的做法甚至不一定很明显。在许多情况下,您确实希望查看公式环境。
在 R Chat 上有一个关于这个问题的松散相关的讨论:
  • Ben Bolker outlines an issue
  • Josh O'Brien points to some old references
  • 关于R:使用作为对象传递的参数评估数据框中的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29804854/

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