【问题标题】:Use of lapply with custom functions of several arguments使用带有多个参数的自定义函数的 lapply
【发布时间】: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 &lt;- Map(f, a_files, b_files, type = "b") 这样的东西应该非常接近。
  • 你不能通过两次调用 mapply 来做到这一点吗? mapply(f,a_files, type = "a"); mapply(f,b_files, type = "b")
  • 另一种方法是创建两个函数,f_afilef_bfile为这两种类型的文件,lapplya_filesb_files为各自的函数,然后c连接两个列表。

标签: r function lapply


【解决方案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 将返回所有包含“.act”或“.deg”的文件。
注意:您的模式不正确,因为它会返回包含任何后跟“act”或“deg”的字符的文件。

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多