【问题标题】:Passing list element names as a variable to functions within lapply将列表元素名称作为变量传递给 lapply 中的函数
【发布时间】:2016-09-02 19:40:31
【问题描述】:

我有一个命名的数据列表和一个我想应用于数据的自定义函数:

#Some example data
d.list <- list(a = c(1,2,3), b = c(4,5,6), c = c(7,8,9))

#A simple function to process some data, write an output graph, and return an output
myfun <- function(data, f.name) {
  y <- list()
  y[1] <- data[1] + data[2] + data[3]
  y[2] <- data[3] - data[1]/ data[2]
  y[3] <- data[2] * data[3] - data[1]
  svg(filename = f.name, width = 7, height = 5, pointsize = 12)
  plot.new()
  plot(data, y)
  dev.off()
  return(y)
}

我现在想使用sapply 对我的列表进行迭代,并为每次迭代获取一个保存的图像文件,文件名设置为列表元素名称(示例中为 egasvg、b.svg、c.svg以上),以及包含计算结果的数据框。当我运行这个时:

#Iterate over the example data using sapply
res <- t(sapply(d.list, function(x) myfun(data=x, 
                  f.name=paste(names(d.list), ".svg", sep = ""))))

我得到了预期的数据框:

  [,1]  [,2] [,3]
a    6 2.500    5
b   15 5.200   26
c   24 8.125   65

但我最终在目标目录中只有一个文件:“a.svg”

如何正确地将列表元素名称作为参数传递给我在sapply 中调用的函数?

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    如果您需要同时迭代两个向量(数据和文件名),请使用mapply(或Map)

    res <- t(mapply(myfun, d.list, paste0(names(d.list), ".svg")))
    

    【讨论】:

      【解决方案2】:

      在 OP 的帖子中,它遍历“d.list”的每个元素,但在每个循环中调用 names(d.list),即调用向量 (c("a", "b", "c"))。我们需要循环“d.list”的names。这样,我们就可以通过子集化的方式得到单个的names 以及list 元素。

       lapply(names(d.list), function(x) paste0(x, ".svg"))
      

      如果我们使用 OP 的功能

       lapply(names(d.list), function(x) myfun(data= d.list[[x]],
                                            f.name = paste0(x, ".svg")))
      

      【讨论】:

        猜你喜欢
        • 2020-01-13
        • 1970-01-01
        • 2017-07-21
        • 1970-01-01
        • 2019-03-11
        • 2020-10-18
        • 1970-01-01
        • 2022-01-11
        • 2014-08-13
        相关资源
        最近更新 更多