如何使用 lapply 从传递给函数的列表中获取 data.frame 的名称
how to get name of data.frame from list passed to function using lapply
我有一个我想扩展的功能,可以将结果保存到 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 调用此函数,那么它基本上可以正常工作(我得到的丑陋名称也包含列表名称,但一种解决方法可能是 trim 使用正则表达式):
> 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.frame 调用此函数时。在这种情况下,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]]"
我哪里做错了,我怎样才能避免提到的正则表达式解决方法并使代码更健壮?
f 列表中的每个数据框都被命名为
lapply (names (LoDf),function(i)write.csv (my.fun1 (LoDf [[i]]),paste0 (i,'.csv')))
就phone所以原谅小错误
问题是 lapply 不提供列表中项目的名称,它只提供项目本身。
另一种解决方案是使用 mapply
,IMO 对输入更具体,而不是依赖范围
mapply(function(L,N){write.csv(L, paste0(N,".csv"));}, L=LoDFs,N=names(LoDFs))
我有一个我想扩展的功能,可以将结果保存到 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 调用此函数,那么它基本上可以正常工作(我得到的丑陋名称也包含列表名称,但一种解决方法可能是 trim 使用正则表达式):
> 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.frame 调用此函数时。在这种情况下,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]]"
我哪里做错了,我怎样才能避免提到的正则表达式解决方法并使代码更健壮?
f 列表中的每个数据框都被命名为
lapply (names (LoDf),function(i)write.csv (my.fun1 (LoDf [[i]]),paste0 (i,'.csv')))
就phone所以原谅小错误
问题是 lapply 不提供列表中项目的名称,它只提供项目本身。
另一种解决方案是使用 mapply
,IMO 对输入更具体,而不是依赖范围
mapply(function(L,N){write.csv(L, paste0(N,".csv"));}, L=LoDFs,N=names(LoDFs))