2017-03-02 37 views
4

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

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

但是,它返回“。”。当使用管道传输此功能时。

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

写的登录生产过程中使用的功能自定义错误消息时,这将是有益的 - 这是很难知道的东西,如果失败,在日志中的唯一的事情就是“”

它可能足以返回原来的电话,其中包括mtcars %>%片。

+0

如何在不知道data.frame名称的情况下启动流水线? 'GET'?这里有一些缺失的背景。 – alistaire

+0

您在编写代码时知道名称,但通过管道调用的函数不知道名称,因此无法提供信息性错误。您希望运行时断言引发包含导致错误的数据框名称的错误。 –

+0

公平。行号会很好,现在我想到了。 – alistaire

回答

6

这是第一次尝试,这是一种黑客,但似乎可能工作。

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函数创建跟踪链零件的环境。我试着在当前执行环境中寻找这个变量,然后使用存储在那里的信息在管道的起始处找到符号。这没有很好的测试。

相关问题