R:隔离和观察事件内部仍发生失效
考虑一个简单的绘图散点图,它依赖于用户选择(通过R:隔离和观察事件内部仍发生失效,r,shiny,r-plotly,R,Shiny,R Plotly,考虑一个简单的绘图散点图,它依赖于用户选择(通过selectInput)来选择要在特定轴上绘图的变量。我们希望通过单击按钮来更新绘图,而不是在用户与selectInput交互时。因此,我们将绘图更新逻辑包装在一个依赖于按钮的observeEvent中。observeEvent更新包含绘图的reactiveValues对象。(本例使用了reactiveValues,因为我们用ggplot和plotly绘图来演示这一点。) 运行应用程序时,在单击action按钮之前,从selectInput更改所选
selectInput
)来选择要在特定轴上绘图的变量。我们希望通过单击按钮来更新绘图,而不是在用户与selectInput
交互时。因此,我们将绘图更新逻辑包装在一个依赖于按钮的observeEvent
中。observeEvent
更新包含绘图的reactiveValues
对象。(本例使用了reactiveValues
,因为我们用ggplot和plotly绘图来演示这一点。)
运行应用程序时,在单击action按钮之前,从selectInput
更改所选变量不会更新绘图(如预期)。但是,单击一次action按钮
后,对selectInput
的任何进一步更改都会立即使plotly plot失效,并使其重新渲染。ggplot不会出现这种行为(仅在单击操作按钮时更新)
我还尝试在隔离
中包装定义plotly plot的被动值,并在输入$update\u plts
按钮上创建显式依赖项,但这没有什么区别
library(shiny)
library(ggplot2)
library(plotly)
ui <- {
fluidPage(
selectInput('select_xvar', label = 'select x var', choices = names(mtcars)),
actionButton('update_plts', 'Update plots'),
plotOutput('plt1'),
plotlyOutput('plt2')
)
}
server <- function(input, output, session) {
val <- reactiveValues(
plt1 = ggplot(mtcars) +
geom_point(aes(x = wt, y = mpg)
),
plt2 = plot_ly(mtcars,
x = ~wt,
y = ~mpg
)
)
observeEvent(input$update_plts, {
val$plt1 = ggplot(mtcars) +
geom_point(aes_string(
x = input$select_xvar,
y = 'mpg'
))
val$plt2 = plot_ly(mtcars,
x = ~get(input$select_xvar),
y = ~mpg)
})
output$plt1 <- renderPlot(val$plt1)
# initial attempt with no isolate
# output$pl2 <- renderPlotly(val$plt2)
# second attempt with isolate, still invalidates instantaneously
output$plt2 <- renderPlotly({
input$update_plts
isolate(val$plt2)
})
}
shinyApp(ui, server)
库(闪亮)
图书馆(GG2)
图书馆(绘本)
ui不确定原因,但当您在绘图
调用中隔离输入时,它会按预期工作:
val$plt2 = plot_ly(mtcars,
x = ~get(isolate(input$select_xvar)),
y = ~mpg)
然后,您可以从renderPlotly
中删除隔离
和操作按钮
:
output$plt2 <- renderPlotly(val$plt2)
输出$plt2