2012-09-03 9 views
3

я встретил проводные проблемы при sapply подмножество к списку dataframe внутри функции, R говоря "Ошибки в Eval (expr, envir, enc): объект 'thresh' не найден ". Интересно, почему это произойдет.Почему параметры, передаваемые по функции не может быть найдены, когда sapply подмножества в список dataframe в R

test<-list() 
test[[1]]<-as.data.frame(matrix(rnorm(50*5,10,100),50,5)) 
test[[2]]<-as.data.frame(matrix(rnorm(50*5,10,100),50,5)) 


findmax<-function(test,thresh){ 
    print(thresh) 
    max(unlist(sapply(test,subset,V1>thresh,select=c("V1")))) 
} 

findmax(test,thresh=10) 

ответ

3

ли внимательно прислушиваться к Предупреждение в ?subset:

Warning: 

    This is a convenience function intended for use interactively. 
    For programming it is better to use the standard subsetting 
    functions like ‘[’, and in particular the non-standard evaluation 
    of argument ‘subset’ can have unanticipated consequences. 

subset имеет некоторые странные правила оценки, как, где она выглядит для объектов и переменных в них, которые зависят от призывающих среды и т.д. Эти работы штрафа при вызове пользователя интерактивно на верхнем уровне, но часто сбой при завершении внутри функций, как вы нашли.

Вот один способ переписать функцию с помощью стандартного подмножества:

findmax <- function(test, thresh, want) { 
    foo <- function(x, thresh, want) { 
     take <- x[, want] > thresh 
     x[take, want] 
    } 
    max(unlist(sapply(test, foo, thresh = thresh, want = want))) 
} 
findmax(test, thresh = 10, want = "V1") 

, который для данных тест дает:

R> findmax(test, thresh = 10, want = "V1") 
[1] 230.9756 
+0

Спасибо за ваш ответ. – Gahoo