我不明白函数里面的错误"找不到对象"

Wes*_*ame 6 r

我大致有这个功能:

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

  splom(models, groups=id)
}
Run Code Online (Sandbox Code Playgroud)

而我这样称呼它:

plot_pca_models(data.pca, log$id)
Run Code Online (Sandbox Code Playgroud)

导致此错误:

Error in eval(expr, envir, enclos) : object 'id' not found
Run Code Online (Sandbox Code Playgroud)

当我没有包装功能调用它时:

splom(data.pca, groups=log$id)
Run Code Online (Sandbox Code Playgroud)

它引发了这个错误:

Error in log$id : object of type 'special' is not subsettable
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

 id <- log$id
 splom(models, groups=id)
Run Code Online (Sandbox Code Playgroud)

它表现得像预期的那样.

请任何人解释为什么它的行为如此以及如何纠正它?谢谢.

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

但他们都没有帮助我.

编辑:根据要求,有完整的"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)
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

产生与上面相同的错误.

Hon*_*Ooi 2

问题在于以非标准方式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)
Run Code Online (Sandbox Code Playgroud)