单击 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)
我创建了一个应用程序,它可以让您绘制绘图。为了显示它,您需要单击 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)