2017-11-28 20 views
0

반응 값을 사용하여 selectizeInput 위젯을로드하고 싶습니다. 간단한 반짝이는 응용 프로그램으로이 작업을 수행 할 수 있지만 모듈로 재구성하려고 할 때이를 복제 할 수없는 것 같습니다.반짝 이는 모듈에서 updateSelectizeInput

다음 코드에는 입력 위젯과 버튼이있는 간단한 앱이 있습니다. 버튼을 누른 후 selectizeInput() 위젯을 반응 변수에 저장된 값으로 업데이트하려고합니다.

library(shiny) 

# GLOBAL VAR TO BE LOADED after pressing the button 
# ------------- 
STORED <- reactiveValues(choices = c("a", "b", "c") 
         , selected = c("c")) 

# UI 
# ------------- 
ui <- fixedPage(
    wellPanel(
    # input widget 
    selectInput("widget1" 
       , "label" 
       ,choices = c("WRONG A","WRONG B","WRONG C") 
       ,selected="WRONG A" 
       ) 

    # update button 
    , actionButton("plotBtn" 
        , "update" 
        , class = "btn-primary") 
) 
) 

# SERVER 
# ------------- 
server <- function(input, output, session) { 

    observeEvent(input$plotBtn,{ 
    message("update button was pressed") 

    updateSelectInput(session 
         ,"widget1" 
         ,choices = STORED$choices 
         , selected = STORED$selected 
    ) 
    }) 
} 

# APP 
shinyApp(ui, server) 

단추를 누르면 위젯이 "c"가 선택된 상태로 올바르게 업데이트되고 선택 사항을 올바르게 가져옵니다. 그러나 반짝이는 모듈로 쓰려고하면 버튼이 작동하지 않습니다.

라이브러리 (반짝)

# INIT VARS TO BE LOADED AFTER PRESSING THE BUTTON 
# ------------------------------------------------------------------------------ 
STORED <- reactiveValues(choices = c("a", "b", "c") 
         , selected = c("c")) 

# MODULE SELECTIZEINPUT 
# ------------------------------------------------------------------------------ 
input_widgetUI <- function(id) { 
    ns <- NS(id) 

    selectizeInput(ns("input_widget") 
       , label = "label" 
       , choices = c("WRONG A","WRONG B","WRONG C") 
       , selected = "WRONG A" 
) 

} 

# MODULE BUTTON 
# ------------------------------------------------------------------------------ 
plotBtnUI <- function(id){ 

    ns <- NS(id) 

    fluidPage(actionButton(ns("plotBtn"), "update", class = "btn-primary")) 
} 

plotBtn <- function(input, output, session) { 

    ns <- session$ns 

    print("Loading plotBtn()") 

    observeEvent(input$plotBtn, { 

    message("update button was pressed") 

    updateSelectizeInput(session 
         , ns("widget1") 
         , choices = STORED$choices 
         , selected= STORED$selected 
         ) 

    }) 
} 


# ############################################################################# 
# SHINY APP 
# ############################################################################# 
ui <- fixedPage(
    wellPanel(
    input_widgetUI("widget1") 
    , plotBtnUI("button") 
) 
) 

server <- function(input, output, session) { 
    callModule(plotBtn, "button") 
} 


shinyApp(ui, server) 

는 내가 잘못된 ID를 사용하고있을 수 있습니다 보라. 어떤 제안이라도 대환영입니다! 감사합니다

+0

왜 모듈을 사용하고 있습니까? 너는 단지 서버 안에 모든 것을 넣을 수는 없다/ui –

+0

모듈은 때때로 매우 유익 할 수있다. 특히 많은 id로 작업 할 때 그렇다. –

답변

0

의 버전을 작동하고 여기에

객체 것이 필요합니다. 버튼과 입력 위젯을 별개의 모듈에 보관할 수 있습니다 (예 : 다른 탭에 버튼이있는 경우).

library(shiny) 
options(shiny.reactlog=TRUE) 

# INIT GLOBAL VARS 
# -------------------------------------------------------------------- 
STORED <- reactiveValues(choices = c("WRONG A","WRONG B","WRONG C") 
         , selected = "WRONG A") 

# MODULE SELECTIZEINPUT 
#---------------------------------------------------------------------- 
input_widgetUI <- function(id) { 

    ns <- NS(id) 

    tagList(
    selectizeInput(ns("input_widget") 
        , label = "label" 
        , choices = NULL 
        , selected = NULL 
    ) 
) 
} 

input_widgetSERVER <- function(input, output, session){ 

    #ns <- session$ns 

    observe({ 

    updateSelectizeInput(session 
         , "input_widget" 
         , choices = STORED$choices 
         , selected= STORED$selected 
         , server=TRUE 
         ) 
    }) 

} 

# MODULE BUTTON 
# --------------------------------------------------------------------- 
plotBtnUI <- function(id){ 

    ns <- NS(id) 

    fluidPage(actionButton(ns("plotBtn"), "update", class = "btn-primary")) 
} 

plotBtnSERVER <- function(input, output, session) { 

    #ns <- session$ns 

    print("Loading plotBtn()") 

    observeEvent(input$plotBtn, { 

    message("update button was pressed") 

    # VARS TO BE LOADED AFTER PRESSING THE BUTTON 
    STORED$choices <- c("a", "b", "c") 
    STORED$selected <- c("c") 

    }) 
} 


# ###################################################################### 
# SHINY APP 
# ###################################################################### 
ui <- fixedPage(
    tagList(
     input_widgetUI("widget1") 
    , plotBtnUI("button") 
) 
) 

server <- function(input, output, session) { 
    callModule(input_widgetSERVER, "widget1") 
    callModule(plotBtnSERVER, "button") 
} 
# launch the app 
shinyApp(ui, server) 
0

동일한 UI 기능에서 selectizeInput actionButton을 갖고 싶습니다. 그렇지 않으면 각각에 대해 다른 네임 스페이스를 갖게 될 것입니다. 이 경우 서버 부분에 ns 함수가 필요하지 않습니다. 당신은 동적 UI를 렌더링 할 때하는이 솔루션은 내가 찾고 있었는지에 가까운 코드

STORED <- reactiveValues(choices = c("a", "b", "c") 
         , selected = c("c")) 

# MODULE SELECTIZEINPUT 
# ------------------------------------------------------------------------------ 
input_widgetUI <- function(id) { 
    ns <- NS(id) 
    tagList(
    selectizeInput(ns("input_widget") 
       , label = "label" 
       , choices = c("WRONG A","WRONG B","WRONG C") 
       , selected = "WRONG A" 
), 
    actionButton(ns("plotBtn"), "update", class = "btn-primary") 
) 

} 


plotBtn <- function(input, output, session) { 

    ns <- session$ns 

    print("Loading plotBtn()") 

    observeEvent(input$plotBtn, { 

    message("update button was pressed") 
    updateSelectizeInput(session = getDefaultReactiveDomain() 
         , inputId = "input_widget" 
         , choices = STORED$choices 
         , selected= STORED$selected 
    ) 

    }) 
} 


# ############################################################################# 
# SHINY APP 
# ############################################################################# 
ui <- fixedPage(
    wellPanel(
    input_widgetUI("widget1") 
) 
) 
server <- function(input, output, session) { 
    callModule(plotBtn, "widget1") 
} 
shinyApp(ui, server) 
+0

당신의 제안에 감사드립니다! –