【问题标题】:Defining a curve() by a string通过字符串定义曲线()
【发布时间】:2014-05-14 07:20:26
【问题描述】:

早上好,

我被 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')"

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

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

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

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

谢谢

JF

【问题讨论】:

    标签: r expression curve


    【解决方案1】:

    curve 替换一开始的表达式:

    substitute(expression(qq))
    #expression(qq)
    

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

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

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

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

    编辑(2020-09-21):

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

    qq <- parse(text = qq)[[1]]
    eval(substitute(curve(qq), list(qq = qq)))
    

    【讨论】:

    • 确实,您的解决方案有效(谢谢!)。不过,我仍然不确定我是否理解为什么。在这里,您将字符串转换为函数,并使用 curve() 处理函数的能力。没有错,但是为什么不能从字符串 qq 生成表达式并将其直接用于 curve() ?我不介意这么多 eval(parse()),但为什么 curve(expr=eval(parse(text=qq)))curve(expr=parse(text=qq)) 不起作用?
    • 阅读我回答的第一句话。
    • (+1) 了解curve 文档
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多