我正在编写一个实用程序来对一组数据进行一系列测试。我有data.frame中的数据,并希望对每行数据运行N次测试。 (如果我的术语不是全部,那就道歉:我一直在使用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)