Как я могу получить правильную распечатку среды с измененным стоп-вызовом - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь быть умным и написать функцию «stopcat», которая по сути является сокращением для остановки (sprintf («строковая вещь% d», val))

Вот небольшой фрагмент, который не работает

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 

Есть мысли?

Я нашел соответствующий пост Как получить имя вызывающей функции внутри вызываемой подпрограммы? но детали там, кажется, не подходят для остановки (или я не могу понять, что было сказано, возможно)

1 Ответ

1 голос
/ 19 марта 2019

Я не думаю, что вы можете обмануть 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...