2016-11-24 117 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)