2016-11-24 6 views
1

В настоящее время я пишу утилиту для запуска серии тестов по набору данных. У меня есть данные в data.frame и я хотел бы запускать N тестов для каждой строки данных. (Извините, если моя терминология не все там: я использовал R всего пять часов).Итерация над списком функций в R

В моей утилите я хотел бы разделить тесты на разные файлы и в основной программе, загрузить все те тесты и запустить их один раз для каждой строки data.frame. Вот что я делаю на источник соответствующие файлы:

file.sources = list.files(pattern="validator-.*.R$") 
sapply(file.sources,source,verbose = TRUE) 

Это хорошо работает, и если я делаю это в каждом согласованного файла:

b <- function(a) { 
    if(grep("^[[:blank:]]*$", a)) { 
    return(FALSE) 
    } else { 
    return(TRUE) 
} 

test.functions <- append(test.functions, b) 

Тогда я в конечном итоге с test.function списка, который точно содержат все тестовые функции для запуска, но теперь это место, где я застреваю. Я пробовал варианты sapply(), и я думаю, что do.call() также уместен в этом. Это моя нынешняя попытка:

process.entry <- function(a) { 
    lapply(test.functions,do.call,a) 
} 
sapply(all.data,process.entry) 

Моя попытка здесь было создать функцию, которая принимает одну строку данных в качестве аргумента, перебирает test.functions и вызывает do.call() с функцией и строки данных в качестве аргументов. Это, кажется, не работает совсем, а ошибка брошена является:

Error in FUN(X[[i]], ...) : second argument must be a list 

Однако, я не совсем уверен, где происходит эта ошибка, и вполне возможно: есть и другие, уборщик, способы делать то, что я намерены!

+0

Что такое «класс» второго аргумента? –

ответ

1
# I would 
process.entry <- function(a) { 
    # call each function to a 
    # I think a anonymous function is easier here; 
    lapply(test.functions, function(f) f(a)) 
} 

# sapply iterate over column of data.frame by default, 
# if you want to iterate over rows, use for or apply; 
apply(all.data, 1, process.entry) 
Смежные вопросы