【问题标题】:I do not understand error "object not found" inside the function我不明白函数内部的错误“找不到对象”
【发布时间】:2013-08-01 11:10:24
【问题描述】:

我大概有这个功能:

plot_pca_models <- function(models, id) {
  library(lattice)

  splom(models, groups=id)
}

我这样称呼它:

plot_pca_models(data.pca, log$id)

导致此错误:

Error in eval(expr, envir, enclos) : object 'id' not found

当我在没有包装函数的情况下调用它时:

splom(data.pca, groups=log$id)

它引发了这个错误:

Error in log$id : object of type 'special' is not subsettable

但是当我这样做时:

 id <- log$id
 splom(models, groups=id)

它的行为符合预期。

请任何人解释它为什么会这样以及如何纠正它?谢谢。

顺便说一句: 我在这里知道类似的问题,例如:

但他们都没有帮助我。

编辑: 根据要求,有完整的“plot_pca_models”功能:

plot_pca_models <- function(data, id, sel=c(1:4), comp=1) {
  # 'data' ... princomp objects
  # 'id'   ... list of samples id (classes)
  # 'sel'  ... list of models to compare
  # 'comp' ... which pca component to compare

  library(lattice)

  models <- c()
  models.size <- 1:length(data)
  for(model in models.size) {
    models <- c(models, list(data[[model]]$scores[,comp]))
  }
  names(models) <- 1:length(data)

  models <- do.call(cbind, models[sel])

  splom(models, groups=id)
}

edit2: 我已经设法使问题可重现。

require(lattice)
my.data <- data.frame(pca1 = rnorm(100), pca2 = rnorm(100), pca3 = rnorm(100))
my.id <- data.frame(id = sample(letters[1:4], 100, replace = TRUE))

plot_pca_models2 <- function(x, ajdi) {
  splom(x, group = ajdi)
}

plot_pca_models2(x = my.data, ajdi = my.id$id)

产生与上述相同的错误。

【问题讨论】:

  • log 是基础 R 中的一个函数。好的做法是不要在函数之后命名对象...这会造成混淆。
  • 不要调用你的对象loglogbase 包中的一个函数。更改名称并告诉我们问题是否仍然存在。
  • 这是因为 lattice 使用了非标准评估。你实际上并没有说出你想要什么,而是尝试print(splom(models, groups=id))
  • 如何让您的问题可重现?它将把战争缩短 5 年,挽救数千人的生命。
  • @Roman Luštrik:好的:D,在我的问题末尾有描述。

标签: r


【解决方案1】:

问题在于 splom 以非标准方式评估其 groups 参数。快速解决方法是重写您的函数,以便它使用适当的语法构造调用:

f <- function(data, id)
eval(substitute(splom(data, groups=.id), list(.id=id)))

# test it
ir <- iris[-5]
sp <- iris[, 5]
f(ir, sp)

【讨论】:

  • 太好了,谢谢!虽然它看起来有点难看:) 我仍然不明白为什么需要这样做。但是,嘿,至少它有效:)...
【解决方案2】:

log 是基础 R 中的一个函数。好的做法是不要在函数之后命名对象……这会造成混淆。在干净的 R 会话中输入 log$test,你会看到发生了什么:

object of type 'special' is not subsettable

【讨论】:

  • 好的,感谢您的建议,我重命名了日志,现在它的行为略有不同。第一个错误是相同的,第二个消失了(但结果看起来根本没有使用参数组......结果图中的颜色相同)
  • log &lt;- data.frame(a=1:5); log$a
  • @WestFlame 你在plot_pca_models 中的其他任何地方引用id 吗?
  • 不,这是该参数在函数内的唯一用途
  • @WestFlame 错误发生后你从traceback() 得到什么?
【解决方案3】:

这是对 Hong Oi 答案的修改。首先,我建议在主数据框中包含 id,即

my.data <- data.frame(pca1 = rnorm(100), pca2 = rnorm(100), pca3 = rnorm(100), id = sample(letters[1:4], 100, replace = TRUE))

.. 然后

plot_pca_models2 <- function(x, ajdi) {
    Call <- bquote(splom(x, group = x[[.(ajdi)]]))    
    eval(Call)
    }
plot_pca_models2(x = my.data, ajdi = "id")

混淆的原因是 lattice:::splom.formula 中的以下行:

groups <- eval(substitute(groups), data, environment(formula))

...其唯一的一点是能够指定不带引号的组,即

# instead of
splom(DATA, groups="ID")
# you can now be much shorter, thanks to eval and substitute:
splom(DATA, groups=ID)

但是,当然,这使得在其他函数中使用 splom(和其他函数,例如使用“非标准评估”的替代函数)更难使用,并且违反了 R 其余部分“主要”遵循的哲学。

【讨论】:

    猜你喜欢
    • 2011-10-20
    • 2022-10-19
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多