2014-06-17 2 views
24

내 반짝이는 응용 프로그램에서 '입력 재설정'버튼을 구현하고 싶습니다. 내가 알고 싶은 무엇빛나는 응용 프로그램에서 '입력 재설정'버튼

library(shiny) 

runApp(list(

    ui = pageWithSidebar(

    headerPanel("'Reset inputs' button example"), 

    sidebarPanel(
     numericInput("mynumber", "Enter a number", 20), 
     textInput("mytext", "Enter a text", "test"), 
     tags$hr(), 
     actionButton("reset_input", "Reset inputs") 
    ), 

    mainPanel(
     h4("Summary"), 
     verbatimTextOutput("summary") 
    ) 

), 

    server = function(input, output, session) { 

    output$summary <- renderText({ 
     return(paste(input$mytext, input$mynumber)) 
    }) 

    observe({ 
     input$reset_input 
     updateNumericInput(session, "mynumber", value = 20) 
     updateTextInput(session, "mytext", value = "test") 
    }) 
    } 

)) 

는 함수가되어있는 경우 : 여기

내가 기본값으로 다시 값을 설정 업데이트 기능을 사용하고 두 입력이 예입니다 모든 것을 다시 기본값으로 설정합니다. 다중 입력의 경우 유용합니다.

또한 작업 버튼을 눌렀을 때를 감지하기 위해 내 관찰 기능을 사용하는 것이 작업 버튼을 처리하는 '적절한 방법'인지 확실하지 않습니다.

답변

23

shiny에는 이러한 기능이 없지만 입력을 두 번 정의하지 않고도이를 수행 할 수 있습니다. 트릭은 uiOutput을 사용하고 리셋 버튼을 누를 때마다 id가 새로운 것으로 변경되는 div으로 재설정하려는 입력을 감싸는 것입니다.

library(shiny) 

runApp(list(

    ui = pageWithSidebar(

    headerPanel("'Reset inputs' button example"), 

    sidebarPanel(
     uiOutput('resetable_input'), 
     tags$hr(), 
     actionButton("reset_input", "Reset inputs") 
    ), 

    mainPanel(
     h4("Summary"), 
     verbatimTextOutput("summary") 
    ) 

), 

    server = function(input, output, session) { 

    output$summary <- renderText({ 
     return(paste(input$mytext, input$mynumber)) 
    }) 

    output$resetable_input <- renderUI({ 
     times <- input$reset_input 
     div(id=letters[(times %% length(letters)) + 1], 
      numericInput("mynumber", "Enter a number", 20), 
      textInput("mytext", "Enter a text", "test")) 
    }) 

    } 
)) 
+0

멋진 아이디어 ..... – jdharrison

+0

많은 감사합니다! 두 개의 입력 대신 11 개의 코드를 사용하여 원래 응용 프로그램의 코드를 이미 시도했으며 코드가 두 번 입력되지 않는 것이 좋습니다. Btw : html 태그에 도움이되는 정보가 있습니까? 나는 지금까지 "이드"와 그것의 유용성을 알지 못했습니다. – Insa

+1

@Matthew Plourde, @Insa 여기서 div와 id가 정말 중요하다고 생각하지 않습니다.이것은'div (id = letters [times %% length (letters)) + 1]'을'list'로 바꾼 것입니다. –

21

우선 관찰자의 사용은 정확하지만 약간 더 좋은 방법이 있습니다. 대신

observe({ 
    input$reset_input 
    updateNumericInput(session, "mynumber", value = 20) 
    updateTextInput(session, "mytext", value = "test") 
}) 

의 당신은 또한 당신이 renderText 기능에서 명시 적으로 "수익"에, 마지막 문이 자동으로 사용됩니다 필요는 없습니다

observeEvent(input$reset_input, { 
    updateNumericInput(session, "mynumber", value = 20) 
    updateTextInput(session, "mytext", value = "test") 
}) 

으로 변경할 수 있습니다. 주요 질문에 대해서는


: 마태 복음의 솔루션은 매우 중요하지만, 서버에 모든 UI를 이동하지 않고 당신이 원하는 것을 달성 할 수있는 방법도있다. 구조와 로직의 분리가 일반적으로 좋은 아이디어이기 때문에 UI 파일에 UI를 유지하는 것이 더 나은 방법이라고 생각합니다.

전체 면책 조항 : 내 솔루션에는 필자가 작성한 패키지가 사용됩니다. 내 패키지 shinyjs에는 입력 또는 HTML 섹션을 원래 값으로 다시 설정할 수있는 reset 함수가 있습니다. 여기에 코드를 추가하지 않고 원하는 수의 입력으로 확장 할 수있는 방식으로 원래 코드를 원하는 동작으로 조정하는 방법이 있습니다. UI에서 useShinyjs()에 대한 호출을 추가하고 양식에 "id"속성을 추가 한 다음 양식에 reset(id)을 호출하면됩니다.

library(shiny) 

runApp(list(

    ui = pageWithSidebar(

    headerPanel("'Reset inputs' button example"), 

    sidebarPanel(
     shinyjs::useShinyjs(), 
     id = "side-panel", 
     numericInput("mynumber", "Enter a number", 20), 
     textInput("mytext", "Enter a text", "test"), 
     tags$hr(), 
     actionButton("reset_input", "Reset inputs") 
    ), 

    mainPanel(
     h4("Summary"), 
     verbatimTextOutput("summary") 
    ) 

), 

    server = function(input, output, session) { 

    output$summary <- renderText({ 
     return(paste(input$mytext, input$mynumber)) 
    }) 

    observeEvent(input$reset_input, { 
     shinyjs::reset("side-panel") 
    }) 
    } 

)) 
+0

데이터 필터링과 크로스 탭 및 플롯 생성에 대한 도움을 찾고있었습니다. 나는이 일을하는 법을 알려주는데 정말로 도움이 될 것입니다. 내 질문을 올렸으므로 몇 가지 해결책을 제안 할 수 있기를 바랍니다. 고맙습니다!! 내 게시물에 대한 링크는 http://stackoverflow.com/questions/41187194/shiny-dynamic-filter-variable-selection-and-display-of-variable-values-for-selec입니다. – user1412

+0

딘 고맙습니다, 가능하다고 생각하십니까? 당신의 기능을 shiny 또는 shinydashboards 패키지에 직접 추가 하시겠습니까? –

+1

@DimitriPetrenko 재설정 기능을 반짝 반짝 빛나는 빛으로 바꾸는 것을 의미합니까? 나는 그것이 일어날 것이라고 생각하지 않는다. 원하는 경우 rstudio에 대해 물어볼 수 있습니다. 그러나 shinyjs는 다른 많은 유용한 함수를 가지고 있기 때문에 함께 패키지를 유지하는 것이 합리적이라고 생각한다. –

0

여기에는 정적 또는 동적 입력에 사용할 수있는 또 다른 옵션이 있으며 입력을 완전히 다시 렌더링하지 않아도됩니다.

그것은 사용

reactiveValuesToList 모든 초기 입력 값을 얻기 위해, 그리고 (선택적으로) 후에 초기화 될 동적 입력 값.

session$sendInputMessage 일반 입력 값을 업데이트합니다. updateXyzInput 함수는 후드 아래 session$sendInputMessage(inputId, list(value = x, ...)과 같이 이것을 호출합니다.

모든 반짝이 입력은 입력 메시지에 value을 사용하며 거의 모든 입력 값이 그대로 업데이트됩니다.내가 찾은 두 개의 입력만으로는 특별한 케이스가 필요하지 않습니다. 아무 것도 선택하지 않으면 NULL을 보내지 않으려면 checkboxGroupInput, c(start, end)list(start = start, end = end)으로 변환하려면 dateRangeInput을 보내야합니다.

맹목적으로 모든 입력을 재설정하는 것은 좋지 않을 수도 있지만 (탭이 재설정 될 수도 있음) 필터링 된 입력 세트를 쉽게 재설정 할 수 있습니다.

library(shiny) 

ui <- pageWithSidebar(
    headerPanel("'Reset inputs' button example"), 

    sidebarPanel(
    numericInput("mynumber", "Enter a number", 20), 
    textInput("mytext", "Enter text", "test"), 
    textAreaInput("mytextarea", "Enter text", "test"), 
    passwordInput("mypassword", "Enter a password", "password"), 
    checkboxInput("mycheckbox", "Check"), 
    checkboxGroupInput("mycheckboxgroup", "Choose a number", choices = c(1, 2, 3)), 
    radioButtons("myradio", "Select a number", c(1, 2, 3)), 
    sliderInput("myslider", "Select a number", 1, 5, c(1,2)), 
    uiOutput("myselUI"), 
    uiOutput("mydateUI"), 
    tags$hr(), 
    actionButton("reset_input", "Reset inputs") 
), 

    mainPanel(
    h4("Summary"), 
    verbatimTextOutput("summary") 
) 
) 

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

    initialInputs <- isolate(reactiveValuesToList(input)) 

    observe({ 
    # OPTIONAL - save initial values of dynamic inputs 
    inputValues <- reactiveValuesToList(input) 
    initialInputs <<- utils::modifyList(inputValues, initialInputs) 
    }) 

    observeEvent(input$reset_input, { 
    for (id in names(initialInputs)) { 
     value <- initialInputs[[id]] 
     # For empty checkboxGroupInputs 
     if (is.null(value)) value <- "" 
     session$sendInputMessage(id, list(value = value)) 
    } 
    }) 

    output$myselUI <- renderUI({ 
    selectInput("mysel", "Select a number", c(1, 2, 3)) 
    }) 

    output$mydateUI <- renderUI({ 
    dateInput("mydate", "Enter a date") 
    }) 

    output$summary <- renderText({ 
    return(paste(input$mytext, input$mynumber)) 
    }) 
} 

shinyApp(ui, server)