Shiny & ggvis select 动态数据子集
Shiny & ggvis select subset of data dynamically
如何 select 数据子集并使用 shiny
和 ggvis
绘制它?
正如 ggvis documentation 所述,无法使用 ggvis
input_select
交换数据集。除了这个限制之外,如果数据预处理和过滤只需要执行一次,那就太棒了。
这是我使用 selectInput()
的尝试。我希望能够选择部分或整个数据集进行显示
library(ggvis)
library(dplyr)
set.seed(1233)
cocaine <- cocaine[sample(1:nrow(cocaine), 500), ]
shinyServer(function(input, output, session) {
output$choose_dataset <- renderUI({
selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
})
if(input$dataset != "Give me all!"){
a <- filter(rawData, cocaine$state == input$dataset)
}
if(input$dataset == "Give me all!"){
a <- cocaine
}
a$id <- 1:nrow(a)
return(a)
datFiltered %>%
ggvis(~weight, ~price, key := ~id) %>%
bind_shiny("plot1") # Very important!
})
这是UI
library(ggvis)
shinyUI(bootstrapPage(
uiOutput("choose_dataset"),
ggvisOutput("plot1")
))
您的代码有一些问题并且没有 运行...您为什么要从主服务器函数返回?并且您使用了两个未在任何地方定义的变量 dataFiltered
和 rawData
。
这是您要执行的操作的解决方案
runApp(shinyApp(
ui = fluidPage(
uiOutput("choose_dataset"),
ggvisOutput("plot1")
),
server = function(input, output, session) {
output$choose_dataset <- renderUI({
selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
})
observeEvent(input$dataset, {
if(input$dataset == "Give me all!"){
data <- cocaine
} else {
data <- filter(cocaine, cocaine$state == input$dataset)
}
data$id <- seq(nrow(data))
data %>%
ggvis(~weight, ~price, key := ~id) %>%
layer_points() %>%
bind_shiny("plot1")
})
}
))
请尝试 post 可以是 运行 的代码,或者至少在代码中说明什么不是 运行 或者需要定义什么变量等 :)
@daattali - 我对您的解决方案提出了改进建议。您在 observeEvent 中使用过滤器,这将 NA 引入解决方案并导致事件错误触发。相反,使用如下所示的子集:
runApp(shinyApp(
ui = fluidPage(
uiOutput("choose_dataset"),
ggvisOutput("plot1")
),
server = function(input, output, session) {
output$choose_dataset <- renderUI({
selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
})
observeEvent(input$dataset, {
if(input$dataset == "Give me all!"){
data <- cocaine
} else {
data <- subset(cocaine, cocaine$state == input$dataset)
}
data$id <- seq(nrow(data))
data %>%
ggvis(~weight, ~price, key := ~id) %>%
layer_points() %>%
bind_shiny("plot1")
})
}
))
如何 select 数据子集并使用 shiny
和 ggvis
绘制它?
正如 ggvis documentation 所述,无法使用 ggvis
input_select
交换数据集。除了这个限制之外,如果数据预处理和过滤只需要执行一次,那就太棒了。
这是我使用 selectInput()
的尝试。我希望能够选择部分或整个数据集进行显示
library(ggvis)
library(dplyr)
set.seed(1233)
cocaine <- cocaine[sample(1:nrow(cocaine), 500), ]
shinyServer(function(input, output, session) {
output$choose_dataset <- renderUI({
selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
})
if(input$dataset != "Give me all!"){
a <- filter(rawData, cocaine$state == input$dataset)
}
if(input$dataset == "Give me all!"){
a <- cocaine
}
a$id <- 1:nrow(a)
return(a)
datFiltered %>%
ggvis(~weight, ~price, key := ~id) %>%
bind_shiny("plot1") # Very important!
})
这是UI
library(ggvis)
shinyUI(bootstrapPage(
uiOutput("choose_dataset"),
ggvisOutput("plot1")
))
您的代码有一些问题并且没有 运行...您为什么要从主服务器函数返回?并且您使用了两个未在任何地方定义的变量 dataFiltered
和 rawData
。
这是您要执行的操作的解决方案
runApp(shinyApp(
ui = fluidPage(
uiOutput("choose_dataset"),
ggvisOutput("plot1")
),
server = function(input, output, session) {
output$choose_dataset <- renderUI({
selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
})
observeEvent(input$dataset, {
if(input$dataset == "Give me all!"){
data <- cocaine
} else {
data <- filter(cocaine, cocaine$state == input$dataset)
}
data$id <- seq(nrow(data))
data %>%
ggvis(~weight, ~price, key := ~id) %>%
layer_points() %>%
bind_shiny("plot1")
})
}
))
请尝试 post 可以是 运行 的代码,或者至少在代码中说明什么不是 运行 或者需要定义什么变量等 :)
@daattali - 我对您的解决方案提出了改进建议。您在 observeEvent 中使用过滤器,这将 NA 引入解决方案并导致事件错误触发。相反,使用如下所示的子集:
runApp(shinyApp(
ui = fluidPage(
uiOutput("choose_dataset"),
ggvisOutput("plot1")
),
server = function(input, output, session) {
output$choose_dataset <- renderUI({
selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
})
observeEvent(input$dataset, {
if(input$dataset == "Give me all!"){
data <- cocaine
} else {
data <- subset(cocaine, cocaine$state == input$dataset)
}
data$id <- seq(nrow(data))
data %>%
ggvis(~weight, ~price, key := ~id) %>%
layer_points() %>%
bind_shiny("plot1")
})
}
))