gpt4 book ai didi

r - 将 `curve` 与列表中的函数一起使用

转载 作者:行者123 更新时间:2023-12-02 17:58:36 26 4
gpt4 key购买 nike

为什么curve似乎不适用于从列表中提取的元素?

考虑两个看似相同的函数,但构建方式不同:

a <- function(value){
function(x) x + value
}

m <- lapply(1:3, a)
f <- a(1)
all.equal(f, m[[1]])
#[1] TRUE

curve 适用于 f,但不适用于 m[[1]]:

> curve(m[[1]])
Error in curve(m[[1]]) :
'expr' must be a function, or a call or an expression containing 'x'

但是如果之前提取了对象,它就会起作用:

d <- m[[1]]
curve(d)

有什么理由吗?

最佳答案

curve() 是一个“神奇”函数,它会在可能的情况下尝试将其输入解释为表达式;它并不总是有效。

@user2554330 评论 curve() 正在等待(来自 ?curve):

The name of a function, or a call or an expression written as a function of x which will evaluate to an object of the same length as x.

相反,m[[1]] 是一个计算结果为函数的表达式。相反,d 是函数的名称。您可以使用 curve(m[[1]](x)) 获得您想要的结果,这使得输入成为以 x 函数形式编写的表达式。

在下面的代码中,R 查看传递给 curve() 的表达式,并询问 is.name(sexpr) 是否为 TRUE。此测试对于 f 通过,但对于 m[[1]] 失败(如果您想在函数上下文之外测试它,则需要比较 is. name(quote(f))is.name(quote(m[[1]]))。

奇怪的是,plot(m[[1]])确实工作(它调用plot.function(),它调用curve() 内部有不同的参数)。

sexpr <- substitute(expr)
if (is.name(sexpr)) {
expr <- call(as.character(sexpr), as.name(xname))
}
else {
if (!((is.call(sexpr) || is.expression(sexpr)) && xname %in%
all.vars(sexpr)))
stop(gettextf("'expr' must be a function, or a call or an expression containing '%s'",
xname), domain = NA)
expr <- sexpr
}

关于r - 将 `curve` 与列表中的函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75007972/

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