非常好的问题。这是我使用方式的一个例子;这个应用程序显示了一个 ggplot,用户在一个文本框中给出了 ggplot 的标题 - 但标题更改仅在按下“返回”时才会做出反应:
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())
})
}
)
说明:
这段 Javascript 代码:
$(document).on("keyup", function(e) {
if(e.keyCode == 13){
Shiny.onInputChange("keyPressed", Math.random());
}
});
创建一个新的 Shiny 输入,即input$keyPressed,当在任意位置按下“Return”键时,它会接收一个随机数。
然后我定义了一个响应值,它采用用户在文本框中给出的值 input$title,仅当 input$keyPressed 更改时:
Title <- reactiveVal()
observeEvent(input[["keyPressed"]], {
Title(input[["title"]])
})
最后我将这个反应值传递给ggtitle:
output[["ggplot"]] <- renderPlot({
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) +
geom_point() +
ggtitle(Title())
})