如何通过修改后的停止呼叫获得正确的环境打印输出

时间:2019-03-19 20:02:46

标签: r

我试图变得聪明,编写一个本质上是stop(sprintf(“字符串对象%d”,val))的简写的“ stopcat”函数

这是一个无效的小片段

library( tidyverse ) # For !!
stopcat = function( str, ... ) {
  msg = sprintf( str, ... )
  eval( expr( stop( !!msg ) ), parent.frame(1) )
}

pig = function() {
  cat( "piggy\n" )
  stopcat( "no way! %d", 6 )
  24 * 44
}
pig()

它打印出来

 Error in eval(expr(stop(!!msg)), parent.frame(1)) : no way! 6 

但我想要

 Error in pig : no way! 6 

有什么想法吗?

我找到了相关的帖子 How to get the name of the calling function inside the called routine? 但是那里的细节似乎并不能停止(或者我听不懂他说的是什么)

1 个答案:

答案 0 :(得分:1)

我认为您不能通过操纵评估上下文来欺骗stop。如果确实需要识别该函数,则可以尝试获取该函数的名称,并将其添加到错误消息中,然后关闭默认的表达式标签。例如

stopcat <- function( str, ... ) {
  msg <- sprintf( str, ... )
  fun <- deparse(sys.call(1)[[1]])
  msg <- paste0("(in ", fun, "): ", msg)
  stop( msg, call.=FALSE)
}

pig <- function() {
  cat( "piggy\n" )
  stopcat( "no way! %d", 6 )
  24 * 44
}
pig()
# piggy
#  Error: (in pig): no way! 6