наблюдать за двумя условиями

59
6

Я попытался вложить некоторые "наблюдаемые события" в Shiny, чтобы создать условное правило.

Это должно выглядеть так:

    если щелкнуть по одному ящику, отобразите соответствующий одиночный выход при нажатии кнопки. если щелкнуть обе коробки, отобразите оба выхода при нажатии кнопки.

но он всегда отображает оба выхода.

Любое предложение?

shinyApp(
ui = basicPage(
checkboxInput("box1", label = "Checkbox1", value = FALSE),
checkboxInput("box2", label = "Checkbox2", value = FALSE),
actionButton('buttn', 'Validate'),
verbatimTextOutput("out1"),
verbatimTextOutput("out2")
),
server = function(input, output) {
observeEvent(input$buttn, {

observeEvent(input$box1, {
output$out1 <- renderText({"Foo"})});

observeEvent(input$box2, {
output$out2 <- renderText({"bar"})})

})
}
)

спросил(а) 2018-02-10T20:37:00+03:00 1 год, 11 месяцев назад
2
Решение
58

Имейте в виду, что неправильная практика заключается в том, чтобы помещать observeEvents или reactives observeEvents другие observeEvents. См. Этот слайд и два после него из презентации Джо Ченга.

Одно из возможных решений - просто показать или скрыть элементы с пакетом shinyjs. Ниже приведен рабочий пример.

Другим решением является использование reactiveVal для хранения текста, который будет отображаться, и обновления с вашего наблюдателя.

Надеюсь это поможет!

Решение 1

library(shiny)
library(shinyjs)

ui <- basicPage(
checkboxInput("box1", label = "Checkbox1", value = FALSE),
checkboxInput("box2", label = "Checkbox2", value = FALSE),
actionButton('buttn', 'Validate'),
shinyjs::hidden(div(id='div1', verbatimTextOutput("out1"))),
shinyjs::hidden(div(id='div2', verbatimTextOutput("out2"))),
useShinyjs()
)

server <- function(input, output) {
observeEvent(input$buttn, {
if(input$box1)
shinyjs::show('div1')
else
shinyjs::hide('div1')

if(input$box2)
shinyjs::show('div2')
else
shinyjs::hide('div2')
})

output$out1 <- renderText({"Foo"})
output$out2 <- renderText({"bar"})

}

shinyApp(ui,server)

Решение 2

library(shiny)
library(shinyjs)

ui <- basicPage(
checkboxInput("box1", label = "Checkbox1", value = FALSE),
checkboxInput("box2", label = "Checkbox2", value = FALSE),
actionButton('buttn', 'Validate'),
verbatimTextOutput("out1"),
verbatimTextOutput("out2")
)

server <- function(input, output) {
text1 <- reactiveVal(NULL)
text2 <- reactiveVal(NULL)

observeEvent(input$buttn, {
ifelse(input$box1,text1('Foo'),text1(NULL))
ifelse(input$box2,text2('Bar'),text2(NULL))
})

output$out1 <- renderText({text1()})
output$out2 <- renderText({text2()})

}

shinyApp(ui,server)

enter image description here

ответил(а) 2018-02-10T21:00:00+03:00 1 год, 11 месяцев назад
Еще 1 ответ
58

Вам не нужны дополнительные наблюдатели за событиями. Просто наблюдайте за нажатием кнопки и используйте стандартную условную логику R для настройки вывода на основе флажков.

shinyApp(
ui = basicPage(
checkboxInput("box1", label = "Checkbox1", value = FALSE),
checkboxInput("box2", label = "Checkbox2", value = FALSE),
actionButton('buttn', 'Validate'),
verbatimTextOutput("out1"),
verbatimTextOutput("out2")
),
server = function(input, output) {
observeEvent(input$buttn, {
if (input$box1) {
output$out1 <- renderText({"Foo"})
}
if (!input$box1) {
output$out1 <- renderText({NULL})
}
if (input$box2) {
output$out2 <- renderText({"Bar"})
}
if (!input$box2) {
output$out2 <- renderText({NULL})
}
})
}
)

ответил(а) 2018-02-10T20:59:00+03:00 1 год, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема