我正在使用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”等。
答案 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
不反映已知功能,则会发生。)