【发布时间】:2016-09-10 12:18:48
【问题描述】:
我在将 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”这一事实有关,但我尽我所能想不出一种方法修复它...
【问题讨论】:
-
'mapply' 函数在这里可能有用
-
或者
Map,它是mapply的一个方便的包装器,它总是返回一个类似lapply的列表。像act_list <- Map(f, a_files, b_files, type = "b")这样的东西应该非常接近。 -
你不能通过两次调用 mapply 来做到这一点吗?
mapply(f,a_files, type = "a"); mapply(f,b_files, type = "b") -
另一种方法是创建两个函数,
f_afile和f_bfile为这两种类型的文件,lapplya_files和b_files为各自的函数,然后c连接两个列表。