2013-08-01 2 views
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) 

이 예상 다르게 동작한다.

누구나 왜이 문제를 어떻게 해결할 수 있는지 설명 할 수 있습니까? 감사. BTW

: 나는 예를 들어, 여기에 비슷한 질문 알고 있어요 :

하지만 그들 중 누구도 나에게 도움이되지 않습니다.

편집 : 요청으로, 전체가 "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 빠른 수정이 구축 있도록 기능을 재 작성하는 비표준 방법 the way.â 년 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

좋습니다, 조언 주셔서 감사합니다, 나는 로그의 이름을 바꾸었지만 지금은 약간 다르게 작동합니다. 첫 번째 오류는 동일하고 두 번째 오류는 사라집니다 (결과는 매개 변수 그룹이 전혀 사용되지 않은 것처럼 보입니다 ... 결과 그래프의 색상은 동일합니다) – WestFlame

+0

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

+0

@WestFlame''id'를'plot_pca_models' 내부 어디에서나 참조합니까? – 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)) 

).

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

... 그의 유일한 지점입니다 따옴표없이 그룹을 지정 할 수 있도록 : 다음 혼란의 원인

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에 다음 줄은 즉

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

그러나 물론

, 이것은 splom를 사용한다, (그리고 다른 기능은 "비표준 평가"를 사용하여 대체 예) 다른 함수 내에서 사용을 어렵게하고 philosop 반대 "대부분"은 R의 나머지 부분을 따릅니다.

관련 문제