通过字符串定义曲线()

jfm*_*yen 4 curve expression r

早上好,

我被困在 R 中字符串和表达式之间的类型转换。我想绘制一条曲线(使用 curve() 函数),其中一个由字符串定义的方程如下:

curve(x^3)
## Ok, generates a curve as expected

qq<-"x^3"
curve(qq)
Error in UseMethod("qq") : 
no applicable method for 'qq' applied to an object of class "c('double', 'numeric')"
Run Code Online (Sandbox Code Playgroud)

我可以理解,第一个 arg 应该是一个表达式。

curve(expr=expression(qq))
Error in curve(expr = expression(qq)) : 
  'expr' must be a function, or a call or an expression containing 'x'
Run Code Online (Sandbox Code Playgroud)

我无法理解:我对这个人的 expression() 的理解是“... expression 返回一个包含其参数(未计算)的“表达式”类型的向量。”

那么,我必须怎么做才能用由字符串 qq 的内容定义的方程来绘制曲线?

谢谢

杰夫

Rol*_*and 5

curve 替换一开始的表达式:

substitute(expression(qq))
#expression(qq)
Run Code Online (Sandbox Code Playgroud)

形成这个它无法推断它需要什么:

all.vars(substitute(expression(qq)))
#[1] "qq"

all.vars(substitute(x^3))
#[1] "x"
Run Code Online (Sandbox Code Playgroud)

我认为你需要可怕的eval(parse())

x <- 1:10
qq <- "x^3"
ff <- as.function(alist(x=, eval(parse(text=qq))))
curve(ff)
Run Code Online (Sandbox Code Playgroud)

编辑 (2020-09-21):

6 多年后,我会以不同的方式做这件事。我不喜欢 eval(parse())qq在这里,因为它会产生不必要的安全风险。相反,我会将其代入调用并评估对curve.

qq <- parse(text = qq)[[1]]
eval(substitute(curve(qq), list(qq = qq)))
Run Code Online (Sandbox Code Playgroud)