mam grubsza tę funkcję:Nie rozumiem błąd „nie znaleziono obiektu” wewnątrz funkcji
plot_pca_models <- function(models, id) {
library(lattice)
splom(models, groups=id)
}
i dzwonię to tak:
plot_pca_models(data.pca, log$id)
wyniki wich w tym błędzie :
Error in eval(expr, envir, enclos) : object 'id' not found
kiedy nazywają go bez funkcji owijania:
splom(data.pca, groups=log$id)
podnosi ten błąd:
Error in log$id : object of type 'special' is not subsettable
ale kiedy to zrobić:
id <- log$id
splom(models, groups=id)
zachowuje się zgodnie z oczekiwaniami.
Proszę, czy ktoś może wyjaśnić, dlaczego zachowuje się tak i jak to poprawić? Dzięki.
btw: Jestem świadomy podobnych pytań tutaj np:
- Help understand the error in a function I defined in R
- Object not found error with ddply inside a function
- Object disappears from namespace in function
ale żaden z nich nie pomógł mi.
edit: Zgodnie z wnioskiem, nie jest pełna funkcja "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: udało mi się sprawić, że problem jest powtarzalny.
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)
które produkują taki sam błąd jak powyżej.
'log' jest funkcją w bazie R. Dobrą praktyką jest nie nazwać obiektów po funkcjach ... może to spowodować zamieszanie. – Thomas
Nie wywołuj swoich obiektów 'log'. 'log' jest funkcją z pakietu' base'. Zmień nazwę i powiedz nam, czy problem nadal występuje. – shadow
Dzieje się tak dlatego, że kraty używają niestandardowej oceny. Właściwie nie mówisz tego, czego chcesz, ale spróbuj 'print (splom (models, groups = id))' – hadley