R 2.14.1 lessR的OS X dens()不将sample()数据作为输入

时间:2012-11-17 13:54:10

标签: r

R版本2.14.1平台:i386-apple-darwin9.8.0 / i386(32位)

目的: 使用库dens()的函数lessR绘制正态密度曲线和叠加在直方图上的一般密度曲线。

问题: 使用例如生成数据时rnorm()rbinom()效果很好,在sample()生成的数据上运行会返回此错误:

Error in if (from == to) rep.int(from, length.out) else as.vector(c(from,  : 
  argument is of length zero

MWE:

library(lessR)
data <- data.frame(col=sample(20))
y <- data$col
dens(y)

问题: 导致问题的原因以及如果我想要一个包含单个列的数据框,我需要做什么,让我们说,它将包含由sample()函数生成的20行值并将它们用作输入对于dens()

更新(2012-11-17): 我已将R更新为版本2.15.2并将lessR更新为版本2.6(两者都是最新版本)。

使用@Roland提供的数据,错误现在是:

Error in seq.default(x.min, x.max, length = 200) : 
  'from' must be of length 1 

我可以理解为什么会发生这种情况并允许sample()使用多个单个值导致正确的结果。

2 个答案:

答案 0 :(得分:3)

是的,作为lessR的开发者,我发现了这个bug。发生的事情是我有一个&gt;和&lt;密度图居中的条件,但没有=条件。这个=条件是从对样本(20)的调用触发的,因为结果是从1到20的连续整数。显然是一个有效的集合,但是在我的代码中触发了=条件和我以前没有测试过的条件。更改&gt; to&gt; =修复了错误。当我在12月10日左右上传下一个版本时,修复将在CRAN上。维护人员不鼓励频繁更新CRAN,所以我需要等到12月更新。

目前,如果您希望使用示例获得密度图,请运行以下R代码。

y <- sample(20)
dy <- density(y)
plot(dy)

此外,当我大约4年前开始这个项目时,我没有计划用大约43种不同的功能来生成系统的数据分析系统。因此,我的函数初始命名方案并没有很好地概括,因为系统只是从几个函数发展而来,所以我逐渐发展了一个将来不会改变的系统。每个函数可以通过其全名来引用,例如Density,或者现在通过通常的两个字符缩写,在这种情况下为dn。为了一致起见,我决定将缩写设为两个字符,这也是小写字母。目标是生成标准数据分析程序,如直方图或hs,ScatterPlot或sp,BoxPlot或bx,只需很少的工作,并为图形提供颜色主题。默认颜色主题为蓝色,但可以使用设置功能轻松更改。

答案 1 :(得分:2)

当前版本的lessR似乎不再提供函数dens,而是有一个函数Density

您会考虑更新您的R版本和套餐吗?你为什么使用32位版本的R?在Mac上,您应该能够使用64位版本。

我查看了dens中的lessR_2.1.1函数。我无法重现您的错误(因为您没有使用set.seed来使您的代码可重现)。取而代之的是Error in seq(min.x, max.x, length = 200) : Object 'min.x' not foundy <- c(3, 4, 8, 1, 6, 14, 20, 5, 13, 17, 19, 10, 2, 12, 7, 9, 18, 11, 15, 16)

以下是功能代码的摘录:

d.gen <- suppressWarnings(density(x, bw, ...))

        mx <- mean(x)

        # min and max x coordinates for graph, make symmetric
        min.dev.x <- min(d.gen$x) - mx
        max.dev.x <- max(d.gen$x) - mx
        if (abs(min.dev.x) > abs(max.dev.x)) {
          min.x <- min(d.gen$x)
          max.x <- mx + abs(min.dev.x)
        }
        if (abs(max.dev.x) > abs(min.dev.x)) {
          min.x <- mx - abs(max.dev.x)
          max.x <- max(d.gen$x)
        }

请注意,代码未定义min.xmax.x,如果abs(min.dev.x) == abs(max.dev.x),则为错误。当然,通过将第二个if条件更改为if (abs(max.dev.x) >= abs(min.dev.x)) {可以轻松解决这个问题。

可能存在其他错误,但是不值得从实用程序包的存档版本修复函数。当然,我在新的Density函数中遇到了类似的错误,实际上它包含了相同的错误。