2017-06-30 182 views
1

我是新來閃亮(但不是R),並且正在構建一個應用程序,用戶從表中選擇特定的行以導出到csv文件。根據其基本要求,該表格有兩列因素和一列答覆。R閃亮 - 保存來自單選按鈕和複選框的組合輸入

例如,

enter image description here

我本來應用程序設置到用戶基於dataFactor2列,他們可以用它來選擇要導出的行中的值對側邊欄的複選框。 (例如,他們可以選擇導出dataFactor2 == A,G和J的錶行)。但是,對於大量的dataFactor1和dataFactor2級別而言,這很難實現。

我的想法是爲dataFactor1的級別添加單選按鈕。然後,如果您選擇了dataFactor1 == X的單選按鈕,您將獲得A,B和C的複選框,並且該表只會顯示dataFactor1 == X的行。您將選擇行A,B或C,那麼你會轉向Y和Z.在這個過程結束時,你仍然會導出與選定的dataFactor2級別相對應的行。

但是,當我嘗試以這種方式實現時,當我從一個級別的dataFactor1移動到另一個級別時,一切都會重置。有關如何捕獲所有選中框的建議?

下面示例代碼ui.R:

#ui.R 

library(shiny) 

myFactor1<-c("X", "Y", "Z") 
myFactor2<-c() #initialize 

shinyUI(fluidPage(

    titlePanel("Sample"), 

    # Sidebar with radio buttons and checkboxes 
    sidebarLayout(
    sidebarPanel(width=2, 

     #display radio button list of factor1 values 
     radioButtons("factor1", 
        label = "dataFactor1", 
        choices=myFactor1), #dynamically generate factor list 

     #display checkboxes of factor2 values 
     checkboxGroupInput("factor2", 
         label="dataFactor2", 
         choices=myFactor2) #dynamically generate list 

    ), 

    # Show factor2 selections and table 
    mainPanel(

     textOutput("text2"), 
     tableOutput("table2") 


) 

) 

)) 

和server.R:

#server.R 
library(shiny) 

shinyServer(function(input, output, session) { 

    mydata<-data.frame(dataFactor1=c(rep("X", 3), rep("Y", 4), rep("Z", 5)), 
        dataFactor2=c("A", "B", "C", "D", "E", "F", "G", "H", 
            "I", "J", "K", "L"), 
        dataResponse=rnorm(12)) 

    observe({ 
     factor1Choice<-input$factor1 

     myFactor2_list<-mydata$dataFactor2[mydata$dataFactor1==factor1Choice] 

     updateCheckboxGroupInput(session, "factor2", 
           choices = myFactor2_list) 

     mydata2<-mydata[mydata$dataFactor1==factor1Choice,] 

     output$table2<-renderTable(mydata2) 

     observe({ 
      factor2Choice<-input$factor2 
      output$text2<-renderText(factor2Choice) 

     }) 

    }) 

}) 
+0

我的[類似的問題(https://stackoverflow.com/questions/44478182/how-to-access-remember-unchecked-values-in-shiny)幾個星期前。 – lukeA

回答

1

如何捕捉所有選中的盒子有什麼建議?

至於兩個答案here,你可以做(​​快速&髒):

myFactor1<-c("X", "Y", "Z") 
myFactor2<-c() #initialize 

ui <- fluidPage(

    titlePanel("Sample"), 

    # Sidebar with radio buttons and checkboxes 
    sidebarLayout(
    sidebarPanel(width=2, 

     #display radio button list of factor1 values 
     radioButtons("factor1", 
        label = "dataFactor1", 
        choices=myFactor1), #dynamically generate factor list 

     #display checkboxes of factor2 values 
     checkboxGroupInput("factor2", 
         label="dataFactor2", 
         choices=myFactor2) #dynamically generate list 

    ), 

    # Show factor2 selections and table 
    mainPanel(

     textOutput("text2"), 
     tableOutput("table2") 


) 

) 

) 


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

    mydata<-data.frame(dataFactor1=c(rep("X", 3), rep("Y", 4), rep("Z", 5)), 
        dataFactor2=c("A", "B", "C", "D", "E", "F", "G", "H", 
            "I", "J", "K", "L"), 
        dataResponse=rnorm(12)) 

    values <- reactiveValues(cb = with(mydata, setNames(rep(FALSE, nlevels(dataFactor2)), levels(dataFactor2)))) 

    observeEvent(input$factor2, { 
    myFactor2_list<-mydata$dataFactor2[mydata$dataFactor1==input$factor1] 
    values$cb[myFactor2_list] <- myFactor2_list %in% input$factor2 
    }) 

    observe({ 
     factor1Choice<-input$factor1 

     myFactor2_list<-mydata$dataFactor2[mydata$dataFactor1==factor1Choice] 

     updateCheckboxGroupInput(session, "factor2", 
           choices = myFactor2_list, 
           selected = levels(mydata$dataFactor2)[values$cb]) 

     mydata2<-mydata[mydata$dataFactor1==factor1Choice,] 

     output$table2<-renderTable(mydata2) 

     observe({ 
      factor2Choice<-input$factor2 
      output$text2<-renderText(factor2Choice) 

     }) 

    }) 

} 
shinyApp(ui, server) 

一般的設置是另一個問題 - 我發現these shiny sessions相當有趣和有益的。

+0

謝謝,@lukeA。這看起來非常接近我想要做的!我將在假期週末多玩一點。 – Wissenschaftler

1

這裏使用列表來存儲選擇的可能解決方案。所有選中的複選框都使用unlist進行恢復。

library(shiny) 

myFactor1<-c("X", "Y", "Z") 

ui <- shinyUI(fluidPage(
    titlePanel("Sample"), 
    # Sidebar with radio buttons and checkboxes 
    sidebarLayout(
    sidebarPanel(width=2, 
     #display radio button list of factor1 values 
     radioButtons("factor1", 
        label = "dataFactor1", 
        choices=myFactor1), #dynamically generate factor list 
     #display checkboxes of factor2 values 
     checkboxGroupInput("factor2", label="dataFactor2") 
    ), 
    # Show factor2 selections and table 
    mainPanel(
     textOutput("text2"), 
     tableOutput("table2"), 
     p("All selections:"), 
     textOutput("text3") 
    ) 
) 
)) 

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

    mydata<-data.frame(dataFactor1=c(rep("X", 3), rep("Y", 4), rep("Z", 5)), 
        dataFactor2=c("A", "B", "C", "D", "E", "F", "G", "H", 
            "I", "J", "K", "L"), 
        dataResponse=rnorm(12)) 

    # to store selections 
    mySelection <- list() 

    observeEvent(input$factor1, { 
    factor1Choice<-input$factor1 
    myFactor2_list<-mydata$dataFactor2[mydata$dataFactor1==factor1Choice] 

    updateCheckboxGroupInput(session, "factor2", 
          choices = myFactor2_list, 
          # update with stored selections 
          selected = mySelection[[input$factor1]]) 

    mydata2<-mydata[mydata$dataFactor1==factor1Choice,] 

    output$table2<-renderTable(mydata2) 

    }) 

    observeEvent(input$factor2, { 
    # backup the selection 
    mySelection[[input$factor1]] <<- input$factor2 
    output$text2 <- renderText(mySelection[[input$factor1]])  
    # get all selections 
    output$text3 <- renderText(unlist(mySelection))  
    }) 

}) 

shinyApp(ui, server) 
+0

謝謝@Geovany。這看起來接近我正在嘗試做的事情,但似乎並沒有刪除已被選中然後取消選中的因素(例如,如果用戶選擇了一列,則決定使用另一列)。 – Wissenschaftler