Tôi đang cố gắng môđun hóa ứng dụng Sáng bóng phức tạp mà tôi có một số conditionalPanel
chỉ xuất hiện cho một trạng thái đầu vào nhất định.R Mô-đun sáng bóng với điều kiệnPanel và các chất phản ứng
Trước khi tôi làm tất cả mọi thứ mô-đun, đầu vào và conditionalPanel đều trong ui.R
, và tôi có thể tham khảo các đầu vào sử dụng một cái gì đó như thế này:
conditionalPanel("input.select == 'Option one'", p('Option one is selected'))
Bây giờ tôi đã Modularized vật, tiếp cận đầu vào là phức tạp hơn. Tôi nghĩ rằng sau đây là cách để làm điều đó, nhưng nó không hoạt động. (Ở đây tôi đã kết hợp mọi thứ vào một kịch bản độc lập duy nhất):
library(shiny)
## Module code for 'selectorUI' and 'selector'
selectorUI <- function(id) {
ns <- NS(id)
selectizeInput(inputId = ns('select'),
label = 'Make a choice:',
choices = c('Option one', 'Option two'))
}
selector <- function(input, output, session) {
reactive(input$select)
}
## Main app
ui <- shinyUI(fluidPage(
selectorUI('id1'),
conditionalPanel(condition = "output.selected == 'Option one'", p('Option one is selected.'))
))
server <- shinyServer(function(input, output, session) {
output$selected <- callModule(selector, 'id1')
})
shinyApp(ui = ui, server = server)
Tôi nghĩ rằng điều này sẽ làm việc, nhưng nó không - nó chỉ hoạt động nếu tôi làm tài liệu tham khảo khác để output$selected
trong phần ui chính:
ui <- shinyUI(fluidPage(
selectorUI('id1'),
textOutput('selected'), ## Adding just this one line makes the next line work
conditionalPanel(condition = "output.selected == 'Option one'", p('Option one is selected.'))
))
Thật không may, điều này có tác dụng không mong muốn khi hiển thị kết quả là textOutput('selected')
. Tôi chỉ có thể đoán rằng lý do này hoạt động là vì nó bằng cách nào đó kích hoạt phản ứng theo cách mà tham chiếu JavaScript không thôi.
Bất kỳ ý tưởng nào về cách tôi sẽ nhận được điều kiện nàyPanel hoạt động bình thường?
Cảm ơn bạn ..
EDIT: Hóa ra không thực sự là một lỗi: https://github.com/rstudio/shiny/issues/1318. Xem câu trả lời của riêng tôi dưới đây.
Nhưng cũng lưu ý rằng tôi thực sự thích giải pháp renderUI
được đưa ra trong câu trả lời được chấp nhận tốt hơn cách tiếp cận ban đầu của tôi conditionalPanel
.
này làm việc, nhưng nó không vi phạm khái niệm về mô đun? Bạn sẽ phải biết mã cho mô-đun nội bộ gọi là đầu vào 'chọn' để xây dựng 'id1-select'. –
Có, bạn nói đúng - tôi đã cập nhật bài đăng của mình. –
Tôi nghĩ rằng đó thực sự là một lỗi. Tôi đã gửi nó với một ví dụ tối thiểu hơn tại https://github.com/rstudio/shiny/issues/1318. Tôi thích giải pháp 'renderUI' tốt hơn, bởi vì' conditionalPanel' dựa trên kiểu 'display: none' để ẩn nội dung, trong khi' renderUI' chỉ đưa ra một div trống. Cảm ơn bạn đã viết. –