1

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

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

问题: 当使用 egrnorm()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 版和lessR2.6 版(两者都是最新可用的)。

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

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

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

4

2 回答 2

3

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

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

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

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

于 2012-11-18T17:21:19.433 回答
2

当前版本lessR似乎不再提供功能dens,而是有一个功能Density

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

denslessR_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.xand max.x,如果abs(min.dev.x) == abs(max.dev.x),这是一个错误。当然,这很容易通过将第二个 if 条件更改为 来解决if (abs(max.dev.x) >= abs(min.dev.x)) {

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

于 2012-11-17T14:47:34.027 回答