获取通过R中的管道传递的数据帧的名称

Rya*_*ght 10 r dplyr magrittr

我希望能够打印通过管道传递的数据帧的名称.这可能吗?我可以.

printname <- function(df){
    print(paste(substitute(df)))
}
printname(mtcars)
#[1] "mtcars"
Run Code Online (Sandbox Code Playgroud)

但是,它返回"." 当使用管道管道此功能时magrittr.

mtcars %>% printname
# [1] "."
Run Code Online (Sandbox Code Playgroud)

在编写已记录的生产过程中使用的函数的自定义错误消息时,这将非常有用 - 如果日志中唯一的内容是".",则很难知道哪些内容失败了.

它可能足以返回原始调用,其中包括该mtcars %>%部分.

MrF*_*ick 12

这是第一次尝试,它是一种黑客攻击,但似乎它可能会起作用.

find_chain_parts <- function() {
    i <- 1
    while(!("chain_parts" %in% ls(envir=parent.frame(i))) && i < sys.nframe()) {
          i <- i+1
      }
    parent.frame(i)
}

printfirstname <- function(df){
    ee <- find_chain_parts()
    print(deparse(ee$lhs))
}

mtcars %>% printfirstname
# [1] "mtcars"
Run Code Online (Sandbox Code Playgroud)

pipe功能创建一个跟踪链部件的环境.我尝试在当前执行环境中查找此变量,然后使用lhs存储在那里的信息在管道的开头找到符号.这没有经过充分测试.

  • 这个技巧使用了 magrittr 1.5 的内部实现细节,不再适用于 magrittr 2.0。 (2认同)