gpt4 book ai didi

r - do.call 和 curve 不能在另一个函数环境中绘制函数

转载 作者:行者123 更新时间:2023-12-04 05:15:50 25 4
gpt4 key购买 nike

我正面临一个关于 的奇怪问题do.call 曲线 :

func1 <- function (m, n) {
charac <- paste ("func2 <- function(x)", m, "*x^", n, sep = "")
eval(parse(text = charac))
return(func2)
}
func3 <- function (m, n) {
my.func <- func1 (m, n)
do.call("curve",list(expr = substitute(my.func)))
}

func1 构造 func2 func3 绘制构建的 func2 .
但是当我运行 func3 ,将显示以下错误:
> func3 (3, 6)
Error in curve(expr = function (x) :
'expr' must be a function, or a call or an expression containing 'x'

但是,虽然我运行 func1 并手动绘制输出(不应用 func3 ), func2 将被绘制 :
my.func <- func1 (3, 6)
do.call("curve",list(expr = substitute(my.func)))

这里发生的事情让我感到困惑,我不知道为什么 do.call 无法绘图 func2 func3 本地环境。

谢谢

最佳答案

不是do.call的问题,但是 substitute默认情况下在全局环境中进行评估。
所以你需要告诉它在哪个环境替换必须发生。这里显然是在 func3 的本地环境中。

这应该有效:

 do.call("curve",list(expr = substitute(my.func,
env = parent.frame())))

编辑 谢谢德温

如评论中所述,将 env 默认为当前评估环境。那么为什么下面的代码有效?答案在 substitute的帮助下

formal argument to a function or explicitly created using delayedAssign(), the expression slot of the promise replaces the symbol. If it is an ordinary variable, its value is substituted, unless env is .GlobalEnv in which case the symbol is left unchanged.


env = parent.frame(n=1)相当于 .GlobalEnv ,这就是符号 (my.func) 保持不变的原因。所以正确答案是:
do.call("curve",list(expr = substitute(my.func,
env = .GlobalEnv)))

为了测试,我打开新的 R session :
func1 <- function (m, n) {
charac <- paste ("func2 <- function(x)", m, "*x^", n, sep = "")
eval(parse(text = charac))
return(func2)
}
func3 <- function (m, n) {
my.func <- func1 (m, n)

do.call("curve",list(expr = substitute(my.func,env = .GlobalEnv)))
}

比我打电话
 func3(2,6)

关于r - do.call 和 curve 不能在另一个函数环境中绘制函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14292218/

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