想到一个很诡异的问题,R语言里能不能自动逐个调用函数?也就是说,假如我有一系列函数,能不能按名字调用它们,自动执行?
类比于,你有系列叫做a,b,c…的函数,目前的调用方式是,a(), b(), c()… 有没有一种办法,可以自动化地执行一下这一系列函数?
我想到这个问题的初衷是,在ChAMP包里,有一系列的Filtering过程,filtering Beads, P value, SNP 等等… 目前的写法是:
if (filteringBeads == TRUE) {…} if (filteringdetP == TRUE) {…} if (filteringSNP == TRUE) {…}
个人觉得很麻烦,而且不太美观,所以在想有没有其他更好的办法一次性解决这个问题,结果解决方案很简单:
# 定义A函数 > A <- function() "Hello" # 定义B函数 > B <- function() "World" # 将两个函数包含如一个list中 > FunctionList <- list("a"=A,"b"=B) # 然后定义一个包含"a","b"名称的vector,用sapply逐个调用 > sapply(c("a","b"),function(x) FunctionList[[x]]()) a b "Hello" "World"另外,还可以设定参数:
> A <- function(i) paste("Hello",i) > B <- function(i) paste("World",i) > FunctionList <- list("a" = A, "b" = B) > lapply(FunctionList,function(x) x("tianyuan")) $a [1] "Hello tianyuan" $b [1] "World tianyuan" >通过这种办法,你就可以一次性定义一对函数,然后用一个character vector去做匹配,一个sapply就执行完了。