2017-06-21 74 views
0

以下示例应用程序以用户必须填写的空表开始。我想在他为Nation和City列选择的值中增加一些依赖项,例如,如果他选择Nation = Italy,当他点击城市列时,只有米兰和罗马应该出现;反之,如果他首先选择米兰,意大利应该出现在自动完成列表中。 建议? 谢谢rhandsontable自动填充依赖列

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) 

回答

0

也许你可以沿着这条道路做一些事情:

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) 
+0

感谢您的回答。我想知道是否有更有效的方式为每个国家和城市做到这一点,或者更一般地说,对于所有可能情况下的2列或更多列中的每个允许值,无需使用开关。 – Syl86

+0

也许在数据框中保存所有国家和城市,并根据用户选择的国家过滤城市? – SBista