2016-12-07 119 views
0

這裏是一個工作的模板:這裏矢量閃亮選擇:: selectInput()

require(data.table) 
require(shiny) 
require(ggplot2) 

x <- data.table(v1 = sample(letters[1:5], 100, replace = T), 
       v2 = sample(letters[1:2], 100, replace = T), 
       v3 = runif(100, 0, 1)) 

ui <- fluidPage(
    sidebarPanel(
    selectInput("in1", "Choice v1", selected = "All", choices = c("All" = list(letters[1:5]))), 
    selectInput("in2", "Choice v2", selected = "a", choices = letters[1:2]) 
), 
    mainPanel(
    plotOutput("out1") 
) 
) 

server <- function(input, output){ 
    output$out1 <- renderPlot({ 
    ggplot(x[v1 %in% input$in1 & v2 %in% input$in2], aes(x = v3)) + 
     geom_density(fill = "dodgerblue4", alpha = .7) + 
     theme_light() 
    }) 
} 

runApp(shinyApp(ui, server)) 

問題是,我想允許變量中的值的子集的選擇。行selectInput("in1", "Choice v1", selected = "All", choices = c("All" = list(letters[1:5])))旨在通過letters[1:5]input$in1有效選擇所有值並在v1上不執行數據子集。

同樣適用於任何其他值的子集,例如選擇"a_b_c" = c("a", "b", "c")"All" = x[,unique(v1)]等。什麼有光澤,是包含在其中的所有值的分列表,基本達到預期結果的相反。 我知道有selectizeInput()選擇多個值。但是,如果我想將所有變量作爲初始狀態,則這是不可行的。

回答

3

會這樣的工作?

#rm(list=ls()) 
require(data.table) 
require(shiny) 
require(ggplot2) 

x <- data.table(v1 = sample(letters[1:5], 100, replace = T), 
       v2 = sample(letters[1:2], 100, replace = T), 
       v3 = runif(100, 0, 1)) 

ui <- fluidPage(
    sidebarPanel(
    selectInput("in1", "Choice v1", selected = "All", choices = c("All",letters[1:5])), 
    selectInput("in2", "Choice v2", selected = "a", choices = letters[1:2]) 
), 
    mainPanel(
    plotOutput("out1") 
) 
) 

server <- function(input, output){ 
    output$out1 <- renderPlot({ 
    value <- input$in1 
    if(value == "All"){ 
     value <- letters[1:5] 
    } 
    ggplot(x[v1 %in% value & v2 %in% input$in2], aes(x = v3)) + 
     geom_density(fill = "dodgerblue4", alpha = .7) + 
     theme_light() 
    }) 
} 

runApp(shinyApp(ui, server)) 

enter image description here

+0

是的,會的。這是可能的解決方法,我應該在後提及。如果你有10個變量全部設置爲「全部」作爲初始狀態,它最終會膨脹很多臨時變量。並且在每個變量選擇中有幾個級別的聚合......否則它是完全有效的選項。我只是希望在閃亮的框架內提供直接解決方案。 –

0

shiny支持多個值中選擇selectInput。您需要設置multiple = TRUEselectize = FALSE。我認爲這會爲你提供你想要的功能。

然後,您可以使choicesselected變量相同以預選所有變量。如果您需要使用「全部」功能,則需要添加一個操作按鈕以運行updateSelectInput。通過編寫一個模塊可以將這兩個功能結合起來。

require(data.table) 
require(shiny) 
require(ggplot2) 

x <- data.table(v1 = sample(letters[1:5], 100, replace = T), 
       v2 = sample(letters[1:2], 100, replace = T), 
       v3 = runif(100, 0, 1)) 

ui <- fluidPage(
    sidebarPanel(
    selectInput("in1", "Choice v1", 
       selected = letters[1:5], 
       choices = letters[1:5], 
       multiple = TRUE, 
       selectize = FALSE), 
    selectInput("in2", "Choice v2", 
       selected = letters[1:2], 
       choices = letters[1:2], 
       multiple = TRUE, 
       selectize = FALSE) 
), 
    mainPanel(
    plotOutput("out1") 
) 
) 

server <- function(input, output){ 
    output$out1 <- renderPlot({ 
    ggplot(x[v1 %in% input$in1 & v2 %in% input$in2], aes(x = v3)) + 
     geom_density(fill = "dodgerblue4", alpha = .7) + 
     theme_light() 
    }) 
} 

runApp(shinyApp(ui, server)) 
+0

這不是我想去的方向。從自己的意義上說,它與選擇選項非常相似,但它不能很好地擴展。我的意思是,這部分問題不是一個好的解決方案:''a_b_c「= c(」a「,」b「,」c「)'。想象一下,如果最初你有基本的城市聚合。然後,我想選擇一個國家和另一個級別的聚合 - 按大陸。最重要的是 - 全部或全球。 –

+0

我正在考慮爲映射創建一個單獨的數據表,並參考通過它的選擇......目前看來是唯一可行的解​​決方案。 –

+1

在這種情況下,我認爲你用豬排的答案可能會更好。我質疑在選擇框中添加「a_b_c」選項的價值。如果您只允許用戶一次選擇一個值,則可能需要提供每個選項的排列方式,這會使用戶界面膨脹 - 這種成本比膨脹服務器端代碼的成本更高(在至少在我看來)。 – Benjamin

0

在閱讀其他答案並想知道可能的乾淨和緊湊的解決方法時,這裏是我想出的。有一個乾淨的方法來添加新的變量是至關重要的。

require(data.table) 
require(shiny) 
require(ggplot2) 

x <- data.table(v1 = sample(letters[1:5], 100, replace = T), 
       v2 = sample(letters[1:2], 100, replace = T), 
       v3 = runif(100, 0, 1)) 

map.dt <- function(x, variables){ 
    map.out <- data.table(name = character(), variable = character(), value = character()) 
    for(i in variables){ 
    map.out <- rbind(map.out, 
        data.table(name = x[,sort(as.character(na.omit(unique(get(i)))))], 
           variable = i, 
           value = x[,sort(as.character(na.omit(unique(get(i)))))]), 
        data.table(name = "All", 
           variable = i, 
           value = x[,sort(as.character(na.omit(unique(get(i)))))])) 
    } 
    return(map.out) 
} 

y <- map.dt(x, c("v1", "v2")) 

ui <- fluidPage(
    sidebarPanel(
    selectInput("in1", "Choice v1", selected = "All", choices = c("All", letters[1:5])), 
    selectInput("in2", "Choice v2", selected = "All", choices = c("All", letters[1:2])) 
), 
    mainPanel(
    plotOutput("out1") 
) 
) 

server <- function(input, output){ 
    output$out1 <- renderPlot({ 
    ggplot(x[v1 %in% y[variable == "v1" & name == input$in1, value] & 
       v2 %in% y[variable == "v2" & name == input$in2, value]], 
      aes(x = v3)) + 
     geom_density(fill = "dodgerblue4", alpha = .7) + 
     theme_light() 
    }) 
} 

runApp(shinyApp(ui, server)) 

基本上,它增加了一個通過函數生成的中間映射表。