6

私はおおよそこの機能を持っています:

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)

上記と同じエラーが発生します。

4

3 に答える 3

2

これは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 の残りの部分で「ほとんど」従う哲学に反します。

于 2013-09-19T12:51:39.203 に答える
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)
于 2013-08-01T13:45:15.867 に答える