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

Я использую Shiny selectInput, где имена функций сопоставляются с match.fun и передаются другой функции. например Можно выбрать между средним, медианой, суммой и т. Д. И передать так: someFunction(summary.fun = match.fun(input$summary_fun))

Когда я пытаюсь восстановить имя функции внутри функции с помощью substitute(summary.fun), которая возвращает match.fun(input$summary_fun).

Я могу передать эту функцию другим функциям, таким как aggregate(..., FUN = summary.fun), и все работает нормально.

Я хотел бы получить имя функции в виде «среднего», «медиана», «сумма» и т. Д.

1 Ответ

1 голос
/ 06 июня 2019

Вы не можете таким образом, не легко.От ?match.fun:

Значение: функция, соответствующая 'FUN' ...

Для меня это означаетон возвращает саму функцию, а не метку, имя или указатель на эту функцию.

Чтобы повысить вероятность того, что вы сможете получить пригодное для использования "имя функции символа", а также фактическое тело функции, попробуйте

someFunction <- function(summary.fun, ...) {
  if (is.character(summary.fun)) {
    funcname <- summary.fun
    realfunc <- match.fun(summary.fun)
  } else if (is.function(summary.fun)) {
    funcname <- deparse(substitute(summary.fun))
    realfunc <- summary.fun
  }
  # ...
}
quux <- reactive({
  req(try(match.fun(input$summary_fun)))
  someFunction(summary.fun = input$summary_fun, ...)
})

Использование req(try(match.fun(input$summary_fun))) означает, что реактивный блок не сработает, если input$summary_fun не соответствует известному имени функции.(Это может быть не совсем необходимо в вашем контексте, для вас.) (Использование try связано с тем, что req вызывает "не правдивый" на объект класса "try-error" ' (из ?req), что произойдет, если input$summary_fun не отражает известную функцию.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...