【问题标题】:R Shiny - how can I pass a select input from UI and into quo() in server file?R Shiny - 如何将选择输入从 UI 传递到服务器文件中的 quo() 中?
【发布时间】:2021-04-20 18:56:22
【问题描述】:

我制作了一个绘图函数,名为 make_figure。此函数接受我要绘制的变量的变量名称等。但是这个函数是为了让我在调用它时需要在变量名周围使用 quo() 。像这样:

make_figure(quo(variableName))

这很好用。

现在我想在 Shiny 应用程序中实现该功能,但我无法找到将变量名从 UI 传递到服务器文件中的 quo() 的方法。

Shiny 服务器文件中调用的函数结构草图,如果我可以像往常一样调用它(在 Shiny 之外):

output$fig <-renderPlot({ 
 make_figure(quo(input$chosenVariable))
})

这当然不起作用,因为 quo(input$chosenVariable) 只是引用 input$chosenVariable 而不是 variableName (quo(variableName)),这是我真正想要做的。

我的 Shiny UI 文件如下所示:

selectInput(
 inputId = "chosenVariable"
 label = "Variable"
 choices = c("Variable Display Name" = "variableName")
)

我想将选项中的变量名传递给服务器端的函数。 我已经在服务器端和应用程序的 UI 端尝试了十几种不同的 !!、quo()、quo_get_expr() 组合,但均未成功。

例如我试过:

用户界面:

selectInput(
  inputId = "chosenVariable"
  label = "Variable"
  choices = c("Variable Display Name" = quo_get_expr(quo(quo(variableName)))
)

服务器:

output$fig <-renderPlot({ 
 make_figure(input$chosenVariable))
})

基本原理是 quo_get_expr(quo(quo(variableName))) 返回 quo(variableName)。但是在 selectInput 中的选择中不允许使用此表达式。

我该如何解决这个问题?

请记住,我的 make_figure 函数是创建的,因此我需要将 quo(variableName) 传递给它。

【问题讨论】:

  • 请发MRE,以便有人可以帮助您。
  • 我宁愿更改make_figure(),使其接受裸名(例如xvar)或字符串(例如"xvar")。两者都不是问题,调用函数也更容易,因为你不需要每次都使用quo()
  • 尝试使用!!sym(input$...) 而不是quo()

标签: r shiny rlang


【解决方案1】:

按照 TimTeaFan 的建议,更改 make_figure 以使其接受正常的变量名称听起来是最明智的。

我发现在函数内部将变量转换为所需的“原格式”可以通过在函数开头放置几行来完成:

make_figure <- function(variableName){

     variableName <- sym({{noquote(variableName)}})
     variableName <- quo({{variableName}})

     (...Excluded: Addional code that now can make use
     of the the variable that now had the needed "quo format"...)

}

这可能是一种更简洁的方法(如果您知道,请发表评论),但至少这是可行的。

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2018-06-12
    • 1970-01-01
    • 2017-11-10
    • 2014-10-07
    • 2019-08-21
    相关资源
    最近更新 更多