如何从使用lapply传递给函数的列表中获取data.frame的名称

时间:2016-03-30 21:56:11

标签: r dataframe lapply evaluation

我有扩展功能,可以将结果保存到csv文件。应根据传递给此函数的data.frame名称生成csv文件的名称:

my.func1 <- function(dframe, ...){
  # PART OF CODE RESPONSIBLE FOR COMPUTATION
  # ...

  # PART OF CODE WHERE I WANT TO STORE RESULTS AS CSV
  csv <- deparse(substitute(dframe))
  csv
}

当我按照以下方式调用此函数时,将正确解释传递给此函数的数据集的名称:

> my.func1(mtcars)
[1] "mtcars"

但我需要从列表中为每个data.frame调用此函数。如果我从列表中为特定的data.frame调用此函数,那么它基本上是可行的(我得到了包含列表名称的丑陋名称,但是可以使用正则表达式修改它):

> LoDFs <- list(first=data.frame(y1=c(1,2,3), y2=c(4,5,6)), second=data.frame(yA=c(1,2,3), yB=c(4,5,6)))
> my.func1(LoDFs$first)
[1] "LoDFs$first"

问题是我想从列表中为所有data.frames调用此函数。在这种情况下,data.frame的名称是混乱的:

> lapply(LoDFs, my.func1)
$first
[1] "X[[i]]"

$second
[1] "X[[i]]"

> lapply(seq_along(LoDFs), function(x) { my.func1(LoDFs[[x]]) })
[[1]]
[1] "LoDFs[[x]]"

[[2]]
[1] "LoDFs[[x]]"

我做错了什么?如何避免使用正则表达式提及的解决方法并使代码更健壮?

2 个答案:

答案 0 :(得分:3)

f列表中的每个数据框都命名为

lapply (names (LoDf),function(i)write.csv (my.fun1 (LoDf [[i]]),paste0 (i,'.csv')))

在手机上原谅小错误

答案 1 :(得分:3)

问题是,lapply不会提供列表中项目的名称,它只会提供项目本身。

另一种解决方案是使用<?xml version="1.0" standalone="no" ?> <!DOCTYPE labels SYSTEM "label.dtd"> <labels _FORMAT="QR_TEST.ZPL" _QUANTITY="1" _PRINTERNAME="" _JOBNAME="TEST"> <label> <variable name="$$QR_CODE$$">QM,B0007FOO[TAB]BAR</variable> </label> </labels> IMO对输入更具体,而不是依赖范围

mapply