Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:隔离和观察事件内部仍发生失效_R_Shiny_R Plotly - Fatal编程技术网

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