迭代R中的函数列表

时间:2016-11-24 07:30:14

标签: r

我正在编写一个实用程序来对一组数据进行一系列测试。我有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

然而,我并不完全确定这个错误发生在哪里,并且很可能:还有其他更清洁的方式来做我想做的事情!

1 个答案:

答案 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)