2013-08-01 17 views
6

内で「オブジェクトが見つかりません」というエラーを理解していません:私はラッピング機能せず、それを呼び出すは、私は大体この機能を持っている機能

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) 

これは、上記と同じエラーが発生します。

+1

'log'は基底Rの関数です。関数の後にオブジェクトの名前を付けるのは良いことではありません。 – Thomas

+0

オブジェクト 'log'を呼び出さないでください。 'log'は' base'パッケージの関数です。名前が変わっても問題が解決しない場合は、教えてください。 – shadow

+0

これは、格子が非標準評価を使用するためです。あなたは実際にあなたが望んでいるとは言いませんが、 'print(splom(models、groups = id))'を試してください。 – hadley

答えて

2

問題はsplomは、クイックフィックスは、それが構築するように、あなたの関数を書き換えることで、非標準way.Aにその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) 
+1

よかった、ありがとう!それは少し醜いように見えます:)と私はまだそれがこのように行われる必要がある理由を理解していません。しかし、ちょっと、少なくともそれは動作します:)... – WestFlame

2

logは、基数Rの関数です。関数の後にオブジェクトの名前を付けるのはお勧めできません。混乱を招く可能性があります。クリーンRセッションにlog$testを入力して、あなたは何が起こっているのかわかります

object of type 'special' is not subsettable

+0

OK、アドバイスをいただきありがとうございます。ログの名前を変更しましたが、動作が少し異なります。最初のエラーは同じで、2番目は消えます(しかし、結果はparamグループがまったく使われていないように見えます...結果グラフの色は同じです) – WestFlame

+0

'log < - data.frame(a = 1:5 ); log $ a' – Roland

+0

@WestFlameあなたは 'plot_pca_models'の中のどこでも' id'を参照していますか? – Thomas

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") 

混乱の原因は、格子::: 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を使用して(および他の機能は、「非標準の評価」を使う代わりに例えば)難しくなり、philosopに反しています"ほとんど"はRの残りの部分に続いています。

関連する問題