单击 ActionButton 并稍后在 Shiny 中引入用户输入后,ActionButton 无法正常工作

ActionButton doesn't work properly after having click it and introduce user's input later in Shiny

我创建了一个应用程序,它可以让您绘制绘图。为了显示它,您需要单击 actionButton。这个想法是,您在情节中所做的每项更改都会在您单击按钮后更改。

但是,如果用户选择该选项,我添加了 numericInput 来更改 y 轴,但现在绘图会自动更新并且它不依赖于 actionButton。我怎样才能避免这种情况?

这是一个可重现的例子:

library(shiny)
library(ggplot2)
library(dplyr)

dt <- data.frame(x=runif(1000), y=runif(1000))

ui <- fluidPage(
  checkboxInput("change_Axis", "Change y_axis"),
  conditionalPanel(
    condition="input.change_Axis",
    numericInput("change_y_axis", label=NULL, value=1, min=1)
  ),
  actionButton("draw","plot"),
  
  plotOutput("rys")
)


server <- function(input,output){
  
  pp <- reactive({
    plot <- ggplot(dt, aes(x,y)) +
      geom_point()
    
    if(input$change_Axis){
      plot <- plot + scale_y_continuous(limits = function(x){
        c(min(x), input$change_y_axis)
      })
    }
    return(plot)
  }) %>% bindEvent(input$draw)

  
  output$rys <- renderPlot({
    pp()
  })
}

shinyApp(ui=ui, server=server)

在应用程序中,当您第一次点击按钮时,您会看到剧情。当您 select 第一次改变轴时,它不会自动改变。您必须单击 actionButton。但是,如果您想再次更改轴(第二次),绘图会自动更改。再改以此类推。

我想避免在用户更改 y 轴后自动更改绘图。我想通过actionButton.

来控制它

有人能帮帮我吗?

提前致谢

我找到了解决问题的方法。

我不得不添加 isolate --> isolate(input$change_y_axis).

现在剧情不更新

library(shiny)
library(ggplot2)
library(dplyr)

dt <- data.frame(x=runif(1000), y=runif(1000))

ui <- fluidPage(
  checkboxInput("change_Axis", "Change y_axis"),
  conditionalPanel(
    condition="input.change_Axis",
    numericInput("change_y_axis", label=NULL, value=1, min=1)
  ),
  actionButton("draw","plot"),
  
  plotOutput("rys")
)


server <- function(input,output){
  
  pp <- reactive({
    plot <- ggplot(dt, aes(x,y)) +
      geom_point()
    
    if(input$change_Axis){
      plot <- plot + scale_y_continuous(limits = function(x){
        c(min(x), isolate(input$change_y_axis))
      })
    }
    return(plot)
  }) %>% bindEvent(input$draw)
  
  
  output$rys <- renderPlot({
    pp()
  })
}

shinyApp(ui=ui, server=server)

另一种选择是将 renderPlot 绑定到 input$draw:

library(shiny)
library(ggplot2)
library(dplyr)

dt <- data.frame(x=runif(1000), y=runif(1000))

ui <- fluidPage(
  checkboxInput("change_Axis", "Change y_axis"),
  conditionalPanel(
    condition="input.change_Axis",
    numericInput("change_y_axis", label=NULL, value=1, min=1)
  ),
  actionButton("draw","plot"),
  
  plotOutput("rys")
)

server <- function(input,output){
  pp <- reactive({
    plot <- ggplot(dt, aes(x,y)) +
      geom_point()
    
    if(input$change_Axis){
      plot <- plot + scale_y_continuous(limits = function(x){
        c(min(x), input$change_y_axis)
      })
    }
    return(plot)
  })
  
  output$rys <- renderPlot({
    pp()
  })  %>% 
    bindEvent(input$draw)
}

shinyApp(ui=ui, server=server)