【问题标题】:How to get function name, when substitute returns an expression当替换返回表达式时如何获取函数名称
【发布时间】:2019-10-22 05:02:43
【问题描述】:

我正在使用 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”等。

【问题讨论】:

    标签: r function expression


    【解决方案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-error”'的对象上触发“not-truthy”(来自?req),如果input$summary_fun 没有反映已知函数,就会发生这种情况。)

    【讨论】:

    • 是的,我最终是这样做的(作为一种解决方法)。我想知道,如果我错过了什么。如果没有答案证明不是这样,我会接受这个作为答案。
    • 一个问题是,如果您deparse(substitute(summary.fun)),您很可能会看到match.fun(input$summary_fun),因为这是提供给被调用函数的内容。为了 R 的一致性,尽管我认为您会尽可能晚地延迟转换为函数;例如,do.callaggregate 都接受匿名函数 (function(x, ...) {...})、命名函数 (mean) 和函数的字符表示 ("mean")。这只是这两个功能,我相信许多其他人也这样做。在someFunction 中有这个逻辑对我来说“很有意义”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多