2013-08-01 9 views
6

ho più o meno questa funzione:Non capisco errore "oggetto non trovato" all'interno della funzione

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

    splom(models, groups=id) 
} 

e sto chiamando in questo modo:

plot_pca_models(data.pca, log$id) 

risultati wich in questo errore :

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

quando lo chiamo io, senza la funzione di involucro:

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

solleva questo errore:

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

ma quando faccio questo:

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

si comporta come previsto.

Per favore qualcuno può spiegare perché si comporta così e come correggerlo? Grazie.

btw: Sono consapevole di domande simili qui, ad esempio:

ma nessuno di loro mi ha aiutato.

modificare: Come richiesto, non v'è piena funzione "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: sono riuscito a rendere il problema riproducibile.

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) 

che producono lo stesso errore come sopra.

+1

'log' è una funzione in base R. È buona norma non assegnare un nome agli oggetti dopo le funzioni ... può creare confusione. – Thomas

+0

Non chiamare il 'log' degli oggetti. 'log' è una funzione del pacchetto' base'. Cambia il nome e dicci se il problema si verifica ancora. – shadow

+0

Questo perché reticolo utilizza una valutazione non standard. In realtà non dici quello che vuoi, ma prova 'print (splom (models, groups = id))' – hadley

risposta

2

Il problema è che splom valuta il suo argomento groups in un way.A non standard soluzione rapida è quella di riscrivere la funzione in modo che costruisce la chiamata con la sintassi appropriata:

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

Grande, grazie! Anche se sembra un po 'brutto :) e ancora non capisco perché debba essere fatto in questo modo. Ma hey, almeno funziona:) ... – WestFlame

2

log è una funzione in base R. È buona norma non assegnare un nome agli oggetti dopo le funzioni ... può creare confusione. Digitare log$test in una sessione di R pulito e vedrete che cosa sta succedendo:

object of type 'special' is not subsettable

+0

OK, grazie per il consiglio, ho rinominato il log e ora si comporta in modo leggermente diverso. Il primo errore è lo stesso, il secondo scompare (ma il risultato sembra che i gruppi param non vengano usati affatto ... i colori nel grafico dei risultati sono gli stessi) – WestFlame

+0

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

+0

@WestFlame Fai riferimento a 'id' in qualsiasi altro posto all'interno di' plot_pca_models'? – Thomas

2

Ecco una modifica della risposta di Hong Oi. Per prima cosa consiglierei di includere l'id nel frame principale dei dati, cioè

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

..e poi

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

La causa della confusione è la seguente riga in lattice ::: splom.formula:

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

... cui punto solo è in grado di specificare i gruppi senza virgolette , cioè,

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

Ma naturalmente, questo rende utilizzando SPLOM (e altre funzioni, quali sostituto che utilizzano "valutazione non standard") complicato da usare all'interno di altre funzioni, ed è contro la philosop hy è "per lo più" seguito nel resto di R.