【问题标题】:Error with curve( ): 'expr' did not evaluate to an object of length 'n'曲线()错误:“expr”未计算为长度为“n”的对象
【发布时间】:2015-03-30 22:59:36
【问题描述】:

我有一个函数,分子中有一个向量,分母中有一个向量的和。所以每个分量都是向量的一个分量除以一个取决于分量总和的函数。我想绘制一条曲线,表示第一个组件中的函数,固定其他组件。为什么这段代码不起作用?

y <- vector(length=2)
y0 <- c(1,2)
f <- function(y) y/(1+sum(y))
g <- function(x) f(c(x,y0[2]))[1]
curve(g, 0, 2)

f 和 g 都按预期计算数值,但曲线函数给出了错误:

Error in curve(g, 0, 2) : 
  'expr' did not evaluate to an object of length 'n'

我尝试对 g 进行矢量化,但没有成功。感谢任何帮助。

【问题讨论】:

    标签: r function vector curve


    【解决方案1】:

    你可以试试:

    h <- Vectorize(g); curve(h, 0, 2)
    

    【讨论】:

    • 行得通,谢谢!我尝试了曲线(Vectorize(g),0, 2),但没有奏效。知道为什么吗?
    • 来自?curve:curve 处理 expr 的方式引起了混乱。它首先查看 expr 是否是一个名称(也称为符号),在这种情况下,它被认为是一个函数的名称,并且 expr 被替换为对 expr 的调用,其名称由 xname 给出.否则,它会检查 expr 是调用还是表达式,并且它包含对 xname 给出的变量的引用(使用 all.vars):其他任何内容都是错误的。
    • @StevenBeaupré:感谢手册中的引用。它没有解释为什么Vectorize() 是必要的。可能是因为curve() 调用了它的expr 参数,方法是向它传递一个包含所有横坐标点的向量一次;但我只是在这里猜测。
    【解决方案2】:

    curve() 使用预期会被矢量化的 expr,因此它可以将 n 点作为x 一次性传入。

    观察f(1:10)给出一个长度为10的向量,而g(1:10)只给出一个值,curve()不喜欢。一个简单的解决方法是向量化函数,例如。

    curve(Vectorize(g)(x), 0, 2)
    

    在哪里'expr' must be a function, or a call or an expression containing 'x'curve(Vectorize(g), 0, 2) 不起作用,因为 Vectorize(g) 需要首先使用 x 进行评估。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      相关资源
      最近更新 更多