是否可以在 Shiny 中对 1 个以上的 checkboxInput 使用 eventReactive?
Is it possible to use eventReactive for more than 1 checkboxInput in Shiny?
几天前我在这个中得到了回答。解决方案在那一刻是完美的,但我意识到我忘了问我如何用超过 1 checkboxInput
来做到这一点。因为...我已经尝试了很多东西,但该解决方案不适合我使用 2 个 checkboxInput。也许可以用相同的解决方案改变一些东西来完成,但是,因为我是新手,所以我找不到办法做到这一点。
上一个 post 和这个代码的区别在于我添加了一个 conditionalPanel 和两个 checkboxInputs 而不是 1.
由于这里的条件是如果用户select是条件(播放),我认为解决方案是写eventReactive(input$play,{})
。但是,none 的 checkboxInputs 有效。
另一方面,如果您写 eventReactive(input$change_log2,{})
一个复选框输入(对数)有效。但是如果你 select 另一个 (srqt) 它什么也不会做。
我看到另一种方法可以使用 observe
或 observeEvent
但我无法将结果保存在变量中,所以...我需要 eventReactive...
有点迷茫
有人可以帮助我吗?最终我会添加更多的 checkboxInputs...所以我需要一种可以使用 2 个以上的 checkboxInputs 的方法。
这是代码:
library(shiny)
# Define UI
ui <- fluidPage(
# Application title
titlePanel("My app"),
sidebarLayout(
sidebarPanel(
uiOutput("selected_sample_one"),
uiOutput("selected_sample_two"),
checkboxInput("play", strong("I want to play my data"), value = FALSE),
conditionalPanel(
condition = "input.play == 1",
checkboxInput("change_log2", "Log2 transformation", value = FALSE),
checkboxInput("run_sqrt", "sqrt option", value = FALSE))
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("plot")
)
)
)
# Define server
server <- function(input, output,session) {
data <- reactive({
numbers <- c(5,345,55,10)
df<-data.frame(t(numbers))
names(df) <- c("S1", "S2", "S3", "S4")
return(df)
})
data1 <- eventReactive(input$play,{
df <- data()
if(input$change_log2 == TRUE){
df <- log2(df)
}
if(input$run_sqrt == TRUE){
df <- sqrt(df)
}
return(df)
})
samples_names <- reactive({
req(data())
samples <- colnames(data())
return(samples)
})
output$selected_sample_one <- renderUI({
selectizeInput(inputId = "sample_one_axis", "Select the 1st sample", choices=samples_names(), options=list(maxOptions = length(samples_names())))
})
# With this function you can select which sample do you want to plot in the y-axis.
output$selected_sample_two <- renderUI({
selectizeInput(inputId = "sample_two_axis", "Select the 2nd sample", choices=samples_names(), selected=samples_names()[2], options=list(maxOptions = length(samples_names())))
})
output$plot <- renderPlot({
req(input$sample_one_axis,input$sample_two_axis,data1())
barplot(c(data1()[,input$sample_one_axis], data1()[,input$sample_two_axis]))
})
}
# Run the application
shinyApp(ui = ui, server = server)
非常感谢,
此致
您可以简单地将相关输入包装在 c()
中。
这是一个 MWE:
library(shiny)
ui <- fluidPage(
checkboxInput("check1", "Checkbox 1"),
checkboxInput("check2", "Checkbox 2"),
textOutput("text")
)
server <- function(input, output, session) {
v <- reactiveValues(text="Waiting...")
observeEvent(c(input$check1, input$check2), {
s <- "Checked: "
if (input$check1) {
s <- paste(s, "1")
}
if (input$check2) {
s <- paste(s, "2")
}
v$text <- s
},
ignoreInit=TRUE
)
output$text <- renderText({
v$text
})
}
shinyApp(ui, server)
或者,您可以将需要做的事情包装在一个函数中,然后在一系列 observeEvent
中调用该函数,每个相关输入一个。
[我在你更新 post 之前就开始写作了。]
感谢@Limey,我的问题的解决方案是将 data1 <- eventReactive
替换为 data1 <- reactive
。
非常感谢。
几天前我在这个checkboxInput
来做到这一点。因为...我已经尝试了很多东西,但该解决方案不适合我使用 2 个 checkboxInput。也许可以用相同的解决方案改变一些东西来完成,但是,因为我是新手,所以我找不到办法做到这一点。
上一个 post 和这个代码的区别在于我添加了一个 conditionalPanel 和两个 checkboxInputs 而不是 1.
由于这里的条件是如果用户select是条件(播放),我认为解决方案是写eventReactive(input$play,{})
。但是,none 的 checkboxInputs 有效。
另一方面,如果您写 eventReactive(input$change_log2,{})
一个复选框输入(对数)有效。但是如果你 select 另一个 (srqt) 它什么也不会做。
我看到另一种方法可以使用 observe
或 observeEvent
但我无法将结果保存在变量中,所以...我需要 eventReactive...
有点迷茫
有人可以帮助我吗?最终我会添加更多的 checkboxInputs...所以我需要一种可以使用 2 个以上的 checkboxInputs 的方法。
这是代码:
library(shiny)
# Define UI
ui <- fluidPage(
# Application title
titlePanel("My app"),
sidebarLayout(
sidebarPanel(
uiOutput("selected_sample_one"),
uiOutput("selected_sample_two"),
checkboxInput("play", strong("I want to play my data"), value = FALSE),
conditionalPanel(
condition = "input.play == 1",
checkboxInput("change_log2", "Log2 transformation", value = FALSE),
checkboxInput("run_sqrt", "sqrt option", value = FALSE))
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("plot")
)
)
)
# Define server
server <- function(input, output,session) {
data <- reactive({
numbers <- c(5,345,55,10)
df<-data.frame(t(numbers))
names(df) <- c("S1", "S2", "S3", "S4")
return(df)
})
data1 <- eventReactive(input$play,{
df <- data()
if(input$change_log2 == TRUE){
df <- log2(df)
}
if(input$run_sqrt == TRUE){
df <- sqrt(df)
}
return(df)
})
samples_names <- reactive({
req(data())
samples <- colnames(data())
return(samples)
})
output$selected_sample_one <- renderUI({
selectizeInput(inputId = "sample_one_axis", "Select the 1st sample", choices=samples_names(), options=list(maxOptions = length(samples_names())))
})
# With this function you can select which sample do you want to plot in the y-axis.
output$selected_sample_two <- renderUI({
selectizeInput(inputId = "sample_two_axis", "Select the 2nd sample", choices=samples_names(), selected=samples_names()[2], options=list(maxOptions = length(samples_names())))
})
output$plot <- renderPlot({
req(input$sample_one_axis,input$sample_two_axis,data1())
barplot(c(data1()[,input$sample_one_axis], data1()[,input$sample_two_axis]))
})
}
# Run the application
shinyApp(ui = ui, server = server)
非常感谢,
此致
您可以简单地将相关输入包装在 c()
中。
这是一个 MWE:
library(shiny)
ui <- fluidPage(
checkboxInput("check1", "Checkbox 1"),
checkboxInput("check2", "Checkbox 2"),
textOutput("text")
)
server <- function(input, output, session) {
v <- reactiveValues(text="Waiting...")
observeEvent(c(input$check1, input$check2), {
s <- "Checked: "
if (input$check1) {
s <- paste(s, "1")
}
if (input$check2) {
s <- paste(s, "2")
}
v$text <- s
},
ignoreInit=TRUE
)
output$text <- renderText({
v$text
})
}
shinyApp(ui, server)
或者,您可以将需要做的事情包装在一个函数中,然后在一系列 observeEvent
中调用该函数,每个相关输入一个。
[我在你更新 post 之前就开始写作了。]
感谢@Limey,我的问题的解决方案是将 data1 <- eventReactive
替换为 data1 <- reactive
。
非常感谢。