【问题标题】:Get name of dataframe passed through pipe in R获取通过R中的管道传递的数据帧的名称
【发布时间】:2017-03-02 16:10:45
【问题描述】:

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

printname <- function(df){
    print(paste(substitute(df)))
}
printname(mtcars)
#[1] "mtcars"

但是,它返回“。”当此函数使用magrittr 管道进行管道传输时。

mtcars %>% printname
# [1] "."

这在编写记录生产过程中使用的函数的自定义错误消息时会很有帮助——如果日志中唯一的内容是“.”,那么很难知道哪里出错了。

返回原始调用可能就足够了,其中包括mtcars %&gt;% 片段。

【问题讨论】:

  • 如何在不知道data.frame名称的情况下启动管道? get?这里缺少一些上下文。
  • 你在写代码的时候知道名字,但是通过管道调用的函数不知道名字,所以它们不会引发信息性错误。您希望运行时断言引发包含导致错误的数据帧名称的错误。
  • 公平。现在想想,行号也不错。

标签: r dplyr magrittr


【解决方案1】:

这是第一次尝试,有点像 hack,但似乎可行。

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"

pipe 函数创建了一个跟踪链部分的环境。我尝试在当前执行环境中查找此变量,然后使用存储在那里的lhs 信息来查找管道开头的符号。这没有经过很好的测试。

【讨论】:

  • 这很好用,但现在在 R 4.0.3、dplyr 1.0.2 上为我在 while() 中的所有步骤返回 NULL。
  • 这个技巧使用了 magrittr 1.5 的内部实现细节,不再适用于 magrittr 2.0。
  • @LionelHenry 那么在 2.0 中有替代方案吗?还是有更多官方支持从内部导航链?
  • 您可以使用magrittr::pipe_nested() 作为管道,这使用与R 4.1 的|&gt; 管道相同的重写方法。所以foo %&gt;% f()在求值前被改写为f(foo),名字就可以被抓到了。不过,我仍然会避免任何依赖于此的模式。
猜你喜欢
  • 2018-06-15
  • 2016-05-20
  • 2012-06-27
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多