我试图变得聪明,编写一个本质上是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? 但是那里的细节似乎并不能停止(或者我听不懂他说的是什么)
答案 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