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

标签 r pipe dplyr chain

我想要一个可以使用从 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/

相关文章:

r - 将颜色和形状的图例合并为一个图例

r - 无法在 CentOS7 上安装 Facebook 先知的 R 库

Linux 为什么我不能通过管道找到结果到 rm?

bash - 为什么管道中的重定向在 Bash 和 Zsh 中表现不同?

r - dplyr 分组并使用多列的条件

r - 并行化 R 脚本

c - 使用 wait() 时,无法读取管道?

r - 使用 dplyr 和 tidyr 制作更复杂的表

r - 如何将多列传递给 dplyr::summarize 中的函数

R 仅使用我处理器的 13%