2016-11-24 119 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

第二個參數的'class'是什麼? –

回答

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)