【问题标题】:Cannot coerce type 'closure' to vector of type 'double' (polygon)无法将类型“闭包”强制为“双”类型的向量(多边形)
【发布时间】:2015-04-26 14:47:07
【问题描述】:
plot( dnorm , col='white')
polygon( dnorm, col='grey' )

返回上述错误消息,不是在plot,而是在polygon


body(polygon) %>% grep(pattern='numeric') 在第 4 行仅找到一次,这似乎与此错误无关。所以我不知道在哪里寻找问题的根源。

【问题讨论】:

  • 这是您的确切代码吗? dnorm 是一个函数。 dnorm(...) 是双精度。
  • @vpipkt 它重现了我的错误。
  • @vpipkt plot 有函数的方法,但显然polygon 没有。我不知道怎么说“只评估dnorm”——答案显然是我自己选择一些值,供它评估。
  • @vpipkt polygon( dnorm(...), col='grey') 不绘制任何内容。
  • 我的意思不是字面意义上的...。请改用dnorm(seq(from=0,to=1,by=.01))。请参阅下面的我和@BrodieG 的答案,了解为什么会这样。

标签: r graphics


【解决方案1】:

plot 有一个函数方法,而polygon 没有。来自?plot

x:图中点的坐标。或者,可以提供单个绘图结构、函数或任何具有绘图方法的 R 对象。

另外,来自?plot.function,绘制函数的S3方法:

## S3 method for class 'function'
plot(x, y = 0, to = 1, from = y, xlim = NULL, ylab = NULL, ...)

这解释了为什么当您将 dnorm 作为参数传递时,您会使用 plot 得到一个值从 0 到 1 的图。

dnorm 等注释函数也称为闭包。这解释了为什么您会收到 polygon 的错误。由于多边形不接受函数作为参数,它会尝试将dnorm(一个闭包)转换为向量,但这不是有效的转换。

polygon 中的错误实际上发生在xy.coord 内的as.double 调用中:

> polygon(dnorm)
Error in as.double(y) : 
  cannot coerce type 'closure' to vector of type 'double'
> traceback()
2: xy.coords(x, y)
1: polygon(dnorm)

注意as.double 不会在跟踪堆栈中注册,因为它是一个原语。通过查看xy.coords 的来源,您可以看到错误发生在哪里。半确认:

> as.double(dnorm)
Error in as.double(dnorm) : 
  cannot coerce type 'closure' to vector of type 'double'

dnorm(-3:3) 实际上会生成一个数字向量,这就是为什么它可以与polygon 一起使用。

【讨论】:

    【解决方案2】:

    对 plot 的调用将解析为不同类型对象的各种默认方法。有关您环境中的列表,请参阅 methods(plot)。对于dnorm,它是plot.function,它将函数作为参数并为函数提供一组输入。顺便说一句,这也适用于rnorm,因为plot.function 提供了n=101 的默认参数。

    plot.function 的更常见别名是 curve

    curve(dnorm, col="grey")
    

    polygon 没有针对各种对象的类似方法。

    【讨论】:

      【解决方案3】:

      您需要polygon( dnorm(-3:3) )xlim 的任何限制。 polygon 缺少处理函数的方法(尽管plot 有)。

      【讨论】:

        猜你喜欢
        • 2015-08-19
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-30
        • 2015-07-01
        • 1970-01-01
        相关资源
        最近更新 更多