闪亮回应输入

Mil*_*Zhu 10 r shiny

我有一个textInput小部件,现在每当我开始键入小部件时,shinyApp会尝试评估textInput小部件中未完成的内容并导致许多错误.我知道添加动作按钮"计算"可以轻松解决问题.但是,我的应用程序没有剩余空间再一个按钮.所以,我想知道是否有一种方法可以让textInput小部件"监听"键盘事件,例如当用户点击"Enter?"时 提前致谢!

Sté*_*ent 9

非常好的问题.这是我使用方式的一个例子; 这个应用程序显示了一个ggplot,用户在文本框中给出了ggplot的标题 - 但标题更改仅在按下"Return"时才会响应:

js <- '
$(document).on("keyup", function(e) {
  if(e.keyCode == 13){
    Shiny.onInputChange("keyPressed", Math.random());
  }
});
'

shinyApp(
  ui = bootstrapPage(

    tags$script(js),

    textInput("title", label = "Title"),

    plotOutput("ggplot")
  ),

  server = function(input, output, session){

    Title <- reactiveVal()

    observeEvent(input[["keyPressed"]], {
      Title(input[["title"]])
    })

    output[["ggplot"]] <- renderPlot({
      ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) +
        geom_point() +
        ggtitle(Title())
    })

  }
)
Run Code Online (Sandbox Code Playgroud)

说明:

这个Javascript代码:

$(document).on("keyup", function(e) {
  if(e.keyCode == 13){
    Shiny.onInputChange("keyPressed", Math.random());
  }
});
Run Code Online (Sandbox Code Playgroud)

创建一个新的Shiny输入,即input$keyPressed在任何地方按下"Return"键时接收一个随机数.

然后我定义一个反应值,它取input$title用户在文本框中给出的值,仅在input$keyPressed更改时:

Title <- reactiveVal()

observeEvent(input[["keyPressed"]], {
  Title(input[["title"]])
})
Run Code Online (Sandbox Code Playgroud)

最后我将此反应值传递给ggtitle:

output[["ggplot"]] <- renderPlot({
  ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) +
    geom_point() +
    ggtitle(Title())
})
Run Code Online (Sandbox Code Playgroud)


Bra*_*sly -1

就您而言,问题是反应式编程,这就是您需要一些东西来管理这种情况的原因。我的建议是使用观察者模式验证函数

  • 观察者模式:shiny 实现了观察者模式,当对象中发生事件时(可以是单击按钮、输入中的新值...),该模式非常有用。

  • 验证功能:此过程的功能类似于 if/else 语句。确实,需要用if来检查参数,如果值错误,就会有错误信息。

要了解如何使用观察模式和验证功能,请单击前面的链接(在 Shiny 网站中,所有内容都有解释)。