使用lapply与几个参数的自定义函数

时间:2016-09-10 12:18:48

标签: r function lapply

我在使用我创建的自定义函数时遇到困难,但这是一个相当具体的功能,我无法找到适合我的答案。

这个功能很长,做了很多事情,但我想我已经设法把它修剪成一个可重复的例子,它给出了我得到的错误。

问题是,我有一个包含两种不同类型文件的文件夹,我想将其作为列表元素加载到R中。它们或多或少具有相同的信息,但它们具有不同的布局,不同的文件扩展名,几乎所有内容都不同,因此导入它们的过程对于每种类型都是不同的。

功能如下:

f <- function(a_file, b_file, type){
if (type == "a"){act <- read.table(a_file, skip = 19, header = TRUE, sep = "", dec = ".")}
if (type == "b"){act <- read.table(b_file, header=FALSE, sep="\t", dec=".")}
return(act)}

然后我用我要调用的两种文件的名称创建向量,如下所示:

a_files <- dir(pattern=".deg")
b_files <- dir(pattern=".act")

最后尝试应用这样的功能:

act_list <- lapply(a_files, f, b_files, type = "b")

如果type = "a"有效,但type = "b"失败,则会出错:

Error in file(file, "rt") : invalid 'description' argument

我非常肯定这与我将该函数仅应用于“a_files”向量而不是“b_files”这一事实有关,但我尽可能多地尝试我无法想办法解决它......

1 个答案:

答案 0 :(得分:1)

有一种更简单的方法可以解决您的问题。

首先,将函数定义为只有一个文件名参数。
然后在里面决定它是什么类型的文件并做正确的读取类型。

readFiles = function(file){
    if(grepl(file,pattern = "\\.deg")){
        act <- read.table(a_file, skip = 19, header = TRUE, sep = "", dec = ".")
    }
    if(grepl(file,pattern = "\\.act")){
        act <- read.table(b_file, header=FALSE, sep="\t", dec=".")
    }
    return(act)
}

最后,您只需要在文件向量上调用lapply

filesVector = dir(pattern = "(\\.act|\\.deg)")
result = lapply(filesVector, readFiles)

filesVector将返回包含&#34; .act&#34;的所有文件或&#34; .deg&#34;。
注意:您的模式不正确,因为它将返回包含任何字符的文件,然后是&#34; act&#34;或者通过&#34; deg&#34;。