gpt4 book ai didi

r - 使用 dplyr 进行管道传输时获取 lhs 对象名称

转载 作者:行者123 更新时间:2023-12-01 22:41:16 25 4
gpt4 key购买 nike

我想要一个可以使用从 dplyr 导出的管道运算符的函数。我没有使用 magrittr。

df %>% my_function

如何获取 df 名称?如果我尝试

my_function <- function(tbl){print(deparse(substitute(tbl)))}

返回

[1] "."

虽然我想要 [1]“df”

有什么建议吗?

提前谢谢您,
尼古拉

最佳答案

JBGruber links to 的答案评论中大部分解决了问题。它的工作原理是在执行环境中向上移动,直到找到某个变量,然后从该环境返回 lhs。唯一缺少的是函数输出原始数据帧的名称和操作数据的要求 - 我从OP的评论中收集了后一个要求。为此,我们只需要输出一个包含这些内容的列表,我们可以通过修改 MrFlick 的答案来实现:

get_orig_name <- function(df){
i <- 1
while(!("chain_parts" %in% ls(envir=parent.frame(i))) && i < sys.nframe()) {
i <- i+1
}
list(name = deparse(parent.frame(i)$lhs), output = df)
}

现在我们可以在任何管道的末尾运行 get_orig_name 来获取列表中的操作数据和原始数据帧的名称。我们使用 $ 访问两者:

mtcars %>% summarize_all(mean) %>% get_orig_name

#### OUTPUT ####

$name
[1] "mtcars"

$output
mpg cyl disp hp drat wt qsec vs am gear carb
1 20.09062 6.1875 230.7219 146.6875 3.596563 3.21725 17.84875 0.4375 0.40625 3.6875 2.8125

我还应该提到的是,虽然我认为这个策略的细节很有趣,但我也认为它不必要地复杂。听起来OP的目标是操纵数据,然后将其写入与原始的、未操纵的数据帧同名的文件中,这可以使用更简单的方法轻松完成。例如,如果我们正在处理多个数据帧,我们可以执行如下操作:

df_list <- list(mtcars = mtcars, iris = iris)

for(name in names(df_list)){
df_list[[name]] %>%
group_by_if(is.factor) %>%
summarise_all(mean) %>%
write.csv(paste0(name, ".csv"))
}

关于r - 使用 dplyr 进行管道传输时获取 lhs 对象名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30057278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com