2017-07-12 155 views
1

應用程序的目標是讓用戶從rshiny中的selectinput函數中選擇一些變量,並根據所選變量選擇相應的數字輸入框,將該變量的權重作爲輸入。使用R中的selectinput函數在選擇多個變量時顯示多個輸入框Shiny

因此,例如,如果我從selectinput函數中選擇四個變量,那麼應該有4個數字輸入框,這將提示用戶輸入相應的權重。

我能夠做到這一點使用複選框選項,而不是selectinput函數,但由於變量數量巨大複選框選項是不可行的。

使用複選框功能的代碼如下:

checkboxInput("pick", "Picked_up"), 
     conditionalPanel(
     condition = "input.pick == true", 
     numericInput("var1","Enter the weightage of the variable","") 
    ), 

     br(), 
     checkboxInput("c2", "%C2"), 
     conditionalPanel(
     condition = "input.c2 == true", 
     numericInput("var2","Enter the weightage of the variable","") 
    ), 
     br(), 
     checkboxInput("newfill", "Perc_Newfill"), 
     conditionalPanel(
     condition = "input.newfill == true", 
     numericInput("var3","Enter the weightage of the variable","") 
    ), 

     br(), 
     checkboxInput("rts", "%RTS"), 
     conditionalPanel(
     condition = "input.rts == true", 
     numericInput("var4","Enter the weightage of the variable","") 
    ) 

我想落實selectinput功能相同的功能,我試過代碼如下:

ui.r

uiOutput('select_value'), 
uiOutput('input_value'), 

server.r

output$select_value <- renderUI({ 
    selectInput('var_name','choose variables',names(descriptive_data),multiple = TRUE) 
    }) 



    runInput2<- observeEvent(input$var_name,{ 


     for(i in 1:length(input$var_name)) 
     { 
     output$input_value <- renderUI({ 
     mydata <- input$var_name[1] 
     numericInput('var', 'input weightage',"") 

     }) 
     } 
    }) 

我是Rshiny的新手,因此可以開放輸入有關我在做什麼錯誤的建議,以及如何實現此目的。

回答

0

這是您的問題的解決方案。它爲所選的每個變量創建一個numericInput。它不使用for循環,而是使用lapply函數,該函數返回包含所有創建的UI元素的列表(這是組合多個UI元素的最佳方式)。最後,爲了避免創建多個觀察者來獲取numericInput的值,只有在選擇了該變量的情況下,才使用動作按鈕來恢復值。在服務器功能開始時,創建了一個矢量來存儲預定義的重量值,這對恢復用戶先前分配的numericInput的值也很有用。這是必要的,因爲每次選擇新變量時,都會再次呈現完整的mainPanel

library(shiny) 

ui <- fluidPage(
    sidebarPanel(uiOutput('select_value')), 
    mainPanel(uiOutput('input_value')) 
) 

server <- function(input , output){ 
    descriptive_data <- mtcars 
    # initial value for weights and to keep track of value 
    weightages <- rep(0, ncol(descriptive_data)) 
    # set names to simplify recover/storing value 
    names(weightages) <- names(descriptive_data) 

    output$select_value <- renderUI({ 
    div(
     selectInput('var_name', 'choose variables', 
     names(descriptive_data), multiple = TRUE), 
     actionButton("get", "Get weightages"), 
     tableOutput('table') 
    ) 
    }) 

    output$input_value <- renderUI({ 
    var_name <- input$var_name 
    if (!is.null(var_name)) { 
     # lapply will return a list 
     lapply(1:length(var_name), function(k) { 
      numericInput(paste0("var", k), 
      paste('input weightage for', 
      # assign stored value 
      var_name[k]), weightages[[var_name[k]]]) 
     }) 
    }  
    }) 

    observeEvent(input$get, { 
    # to avoid create one observer per numeric input 
    # we use a action button to trigger the recovering 
    # of weights. 
    var_name <- input$var_name 
    if (!is.null(var_name)) { 
     for(k in 1:length(var_name)) { 
     # only recover/update value is the numeric input exists 
     if (!is.null(input[[paste0("var", k)]])) 
      weightages[[var_name[k]]] <<- input[[paste0("var", k)]] 
     } 
    } 
    # show current weights 
    output$table <- renderTable(data.frame(
         variable = names(descriptive_data), 
         weightages)) 

    }) 

} 

shinyApp(ui = ui , server = server) 
+0

嗨Geovany,大部分的問題就解決了感謝你的解決方案,但我仍然無法顯示weightages,該rendertable顯示選定變量爲NA值,而未選中的變量的值作爲0 – prateek

+0

什麼Shiny你有什麼版本?我只是再次測試,它工作正常。我正在使用Shiny'1.03' – Geovany

+0

我的糟糕的是數據存在一些問題,現在都很好。非常感謝! – prateek

相關問題