当替换返回表达式时如何获得函数名称

时间:2019-06-06 16:22:50

标签: r function expression

我正在使用Shiny selectInput,其中函数的名称与match.fun匹配并传递给另一个函数。例如可以在平均值,中位数,总和等之间进行选择,并像这样通过 someFunction(summary.fun = match.fun(input$summary_fun))

当我尝试使用substitute(summary.fun)恢复函数内的函数名称时,返回match.fun(input$summary_fun)

我可以将此函数传递给其他功能,例如aggregate(..., FUN = summary.fun),一切正常。

我想检索函数名称为“ mean”,“ median”,“ sum”等。

1 个答案:

答案 0 :(得分:1)

您不能那样,不容易。来自?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-错误”'(来自?req),如果input$summary_fun不反映已知功能,则会发生。)