R 将表达式作为变量传递到曲线

R 将表达式作为变量传递到曲线,r,R,我正在尝试使用一个将函数名存储为字符串的变量来绘制曲线。如下所示: f1 <- function(x) 0*x f2 <- function(x) 1 + 0*x f3 <- function(x) 2 + 0*x fn <- "f1" plot.new() plot.window(xlim = c(0, 1), ylim = c(-1, 3)) curve(get(fn), add = TRUE) Error in curve(get(fn), add = TRU

我正在尝试使用一个将函数名存储为字符串的变量来绘制曲线。如下所示:

f1 <- function(x) 0*x
f2 <- function(x) 1 + 0*x
f3 <- function(x) 2 + 0*x

fn <- "f1"

plot.new()
plot.window(xlim = c(0, 1), ylim = c(-1, 3))

curve(get(fn), add = TRUE)
Error in curve(get(fn), add = TRUE) : 
  'expr' must be a function, or a call or an expression containing 'x'

curve(f1, add = TRUE)
curve(f2, add = TRUE)
curve(f3, add = TRUE)

f1问题是
curve()
不会计算传入的参数。它查看传递给参数的内容,而不是计算参数的结果。当你跑的时候

curve(fn)
curve(get("f1"))  #error
您传递的是一个“名称”(或“符号”)。这将触发函数查找具有该名称的函数。当你跑的时候

curve(fn)
curve(get("f1"))  #error
你打过一个电话。同样,curve不会执行该调用以查看它是否返回函数。正如错误消息所说,如果传入调用,该表达式应该包含
x
。比如说

curve(f1(x))
do.call("curve",list(as.name(fn)))
是带有
x
变量的调用语法示例

如果确实需要将函数指定为字符向量,则可以将字符转换为名称对象,然后使用do.call构建对曲线的调用。比如说

curve(f1(x))
do.call("curve",list(as.name(fn)))
或者,您可以修改调用以使用特殊的
x
变量触发结果函数

curve(get(fn)(x))

如果您想添加额外的参数,例如
add=TRUE
,它看起来是这样的:
do.call(curve,list(as.name(fn),add=TRUE))
您还可以通过首先强制求值来回避这个问题
{get(fn)->f;curve(f,add=TRUE)}