【问题标题】:rhandsontable autocomplete dependent columnsrhandsontable 自动完成依赖列
【发布时间】:2017-11-24 13:03:18
【问题描述】:

以下示例应用以用户必须填写的空表开始。我想在他可以为 Nation 和 City 列选择的值中添加一些依赖项,例如,如果他在单击 City 列时选择 Nation=Italy,则只会出现 Milan 和 Rome;反之亦然,如果他首先选择米兰,则只有意大利应该出现在自动完成列表中。 建议? 谢谢

library(rhandsontable)
library(shiny)

ui = fluidPage(rHandsontableOutput("data"))

server = function(input,output) {
df = data.frame(Nation = character(),City=character(),Num_Clients=integer())
values = reactiveValues(data = df)

observe({
req(input$data)
values$data = hot_to_r(input$data)
})

output$data = renderRHandsontable({
rhandsontable(values$data, height=500, minRows=1,stretchH = "all") %>%
hot_col(col="Nation",type="autocomplete",source=c("England","Spain","Mexico"    ,"Italy"),strict=TRUE,allowInvalid=FALSE) %>% 
hot_col(col="City",type="autocomplete",source=c("Rome","Guadalajara","Madrid    ","London","Milan"),strict=TRUE,allowInvalid=FALSE)  %>% 
hot_validate_numeric(col = "Num_Clients", min = 0)

})
}
shinyApp(ui = ui, server = server)

【问题讨论】:

  • 请在级联下拉菜单中查看相关的 GitHub issue

标签: r shiny rhandsontable


【解决方案1】:

也许你可以沿着这条路做点什么:

 library(rhandsontable)
   library(shiny)

   ui = fluidPage(rHandsontableOutput("data"))

   server = function(input,output) {
     df = data.frame(Nation = character(),City=character(),Num_Clients=integer())
     values = reactiveValues(data = df)

     observe({
       req(input$data)
       values$data = hot_to_r(input$data)
     })

     output$data = renderRHandsontable({
       rhandsontable(values$data, height=500, minRows=1,stretchH = "all") %>%
         hot_col(col="Nation",type="autocomplete",source=c("England","Spain","Mexico"    ,"Italy"),strict=TRUE,allowInvalid=FALSE) %>% 
         hot_col(col="City",type="autocomplete",source=c("Rome","Guadalajara","Madrid    ","London","Milan"),strict=TRUE,allowInvalid=FALSE)  %>% 
         hot_validate_numeric(col = "Num_Clients", min = 0)

     })


     observeEvent(input$data,{

       change <- unlist(input$data$changes$changes)
       if(!is.null(change)){
         #Ifchange in the 1st column(0th Column)
         if(as.numeric(change[2]) == 0 ){#If change in country filter the city
           if(change[4] == "Italy"){#If itality is selected
             output$data = renderRHandsontable({
               rhandsontable(values$data, height=500, minRows=1,stretchH = "all") %>%
                 hot_col(col="Nation",type="autocomplete",source=c("England","Spain","Mexico","Italy"),strict=TRUE,allowInvalid=FALSE) %>% 
                 hot_col(col="City",type="autocomplete",source=c("Rome","Milan"),strict=TRUE,allowInvalid=FALSE)  %>% 
                 hot_validate_numeric(col = "Num_Clients", min = 0)

             })
           }
         }
       }

     })
   }
   shinyApp(ui = ui, server = server)

【讨论】:

  • 感谢您的回答。我想知道是否有一种更有效的方法可以为每个国家和城市执行此操作,或者更一般地说,对于动手操作表的 2 列或更多列中的每个允许值,而不必为所有可能的情况使用开关。
  • 也许将所有国家和城市保存在数据框中,并根据用户选择的国家过滤城市?
  • @SBista 我对您提供的答案非常感兴趣,但是当我在运行脚本时尝试选择国家/地区时收到以下警告消息:shiny error in if: missing value where true/false needed
猜你喜欢
  • 2015-07-31
  • 2019-11-09
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多