在 ggvis 中使用 handle_click 在 Shiny 中创建交互式过滤器
Use handle_click in ggvis to create an interactive filter in Shiny
我有一个使用 ggvis() 图形的基本 Shiny 应用程序。该应用程序如下。
我在 ggvis() 的文档中看到有一个可以传递的 handle_click(vis, on_click = NULL)
函数。此外,on_click
是一个带有参数数据、位置和会话的回调函数。
我想做的是允许用户点击图表中的一个柱状图(每月一个柱状图)并将其设置 input$monthSelect
为他们点击的柱状图所在的月份。如果我要添加一个工具提示,我可以创建一个函数,它会从悬停的图层中获取数据,我可以参考 data$x_
来获取月份。
这个函数的一个例子是:
update_selection = function(data){
if(is.null(data)) return(NULL)
updateSelectInput(session
,"monthSelect"
,selected=data$x_)
}
我通过 ggvis() %>% handle_click(update_selection(data))
将它添加到 ggvis,但我收到错误 Error in func() : could not find function "fun"
。
如何制作反应图?
library(ggvis)
library(dplyr)
library(tidyr)
library(ReporteRs)
data = cocaine
data = within(data,
{
month[month==1] = "January"
month[month==2] = "February"
month[month==3] = "March"
month[month==4] = "April"
month[month==5] = "May"
month[month==6] = "June"
month[month==7] = "July"
month[month==8] = "August"
month[month==9] = "September"
month[month==10] = "October"
month[month==11] = "November"
month[month==12] = "December"
}
)
server = function(input, output, session){
selectedState = reactive(input$stateSelect)
plotData = reactive({
data %>%
group_by(state,month) %>%
summarise(avgPotency = mean(potency)) %>%
ungroup() %>%
spread(month,avgPotency) %>%
mutate(January = ifelse(is.na(January),0,January)
,February = ifelse(is.na(February),0,February)
,March = ifelse(is.na(March),0,March)
,April = ifelse(is.na(April),0,April)
,May = ifelse(is.na(May),0,May)
,June = ifelse(is.na(June),0,June)
,July = ifelse(is.na(July),0,July)
,August = ifelse(is.na(August),0,August)
,September = ifelse(is.na(September),0,September)
,October = ifelse(is.na(October),0,October)
,November = ifelse(is.na(November),0,November)
,December = ifelse(is.na(December),0,December)
) %>%
filter(state==selectedState()) %>%
gather("month","AvgPotency",-state)
})
stateVis = reactive({
plotData() %>%
ggvis(x=~month,y=~AvgPotency)
})
stateVis %>% bind_shiny("cocaineCounts")
selectedMonth = reactive(input$monthSelect)
tableData = reactive({
data %>%
filter(state==selectedState() & month==selectedMonth())
})
output$cocaineTable = renderUI({
MyFTable = FlexTable(tableData(),
header.cell.props = cellProperties( padding = 2 ),
body.cell.props = cellProperties( padding = 2 ))
return(HTML(as.html(MyFTable)))
})
}
ui = shinyUI(
fluidPage(
column(6,
selectInput("stateSelect",label="Select a State:",choices = unique(data$state),selected=1)
,selectInput("monthSelect",label="Select a Month:",choices = c('January','February','March','April','May','June','July','August','September','October','November','December'),selected=1)
,ggvisOutput("cocaineCounts")
)
,column(6,
uiOutput(outputId = "cocaineTable")
)
)
)
shinyApp(ui = ui, server = server)
函数需要更新以接受三个参数:
update_selection = function(data,location,session){
if(is.null(data)) return(NULL)
updateSelectInput(session
,"monthSelect"
,selected=data$x_)
}
和 handle_click() 需要作为 ggvis() %>% handle_click(update_selection)
传递
所以完整的工作应用程序是:
library(ggvis)
library(dplyr)
library(tidyr)
library(ReporteRs)
data = cocaine
data = within(data,
{
month[month==1] = "January"
month[month==2] = "February"
month[month==3] = "March"
month[month==4] = "April"
month[month==5] = "May"
month[month==6] = "June"
month[month==7] = "July"
month[month==8] = "August"
month[month==9] = "September"
month[month==10] = "October"
month[month==11] = "November"
month[month==12] = "December"
}
)
update_selection = function(data,location,session){
if(is.null(data)) return(NULL)
updateSelectInput(session
,"monthSelect"
,selected=data$x_)
}
server = function(input, output, session){
selectedState = reactive(input$stateSelect)
plotData = reactive({
data %>%
group_by(state,month) %>%
summarise(avgPotency = mean(potency)) %>%
ungroup() %>%
spread(month,avgPotency) %>%
mutate(January = ifelse(is.na(January),0,January)
,February = ifelse(is.na(February),0,February)
,March = ifelse(is.na(March),0,March)
,April = ifelse(is.na(April),0,April)
,May = ifelse(is.na(May),0,May)
,June = ifelse(is.na(June),0,June)
,July = ifelse(is.na(July),0,July)
,August = ifelse(is.na(August),0,August)
,September = ifelse(is.na(September),0,September)
,October = ifelse(is.na(October),0,October)
,November = ifelse(is.na(November),0,November)
,December = ifelse(is.na(December),0,December)
) %>%
filter(state==selectedState()) %>%
gather("month","AvgPotency",-state)
})
stateVis = reactive({
plotData() %>%
ggvis(x=~month,y=~AvgPotency) %>%
handle_click(update_selection)
})
stateVis %>% bind_shiny("cocaineCounts")
selectedMonth = reactive(input$monthSelect)
tableData = reactive({
data %>%
filter(state==selectedState() & month==selectedMonth())
})
output$cocaineTable = renderUI({
MyFTable = FlexTable(tableData(),
header.cell.props = cellProperties( padding = 2 ),
body.cell.props = cellProperties( padding = 2 ))
return(HTML(as.html(MyFTable)))
})
}
ui = shinyUI(
fluidPage(
column(6,
selectInput("stateSelect",label="Select a State:",choices = unique(data$state),selected=1)
,selectInput("monthSelect",label="Select a Month:",choices = c('January','February','March','April','May','June','July','August','September','October','November','December'),selected=1)
,ggvisOutput("cocaineCounts")
)
,column(6,
uiOutput(outputId = "cocaineTable")
)
)
)
shinyApp(ui = ui, server = server)
我有一个使用 ggvis() 图形的基本 Shiny 应用程序。该应用程序如下。
我在 ggvis() 的文档中看到有一个可以传递的 handle_click(vis, on_click = NULL)
函数。此外,on_click
是一个带有参数数据、位置和会话的回调函数。
我想做的是允许用户点击图表中的一个柱状图(每月一个柱状图)并将其设置 input$monthSelect
为他们点击的柱状图所在的月份。如果我要添加一个工具提示,我可以创建一个函数,它会从悬停的图层中获取数据,我可以参考 data$x_
来获取月份。
这个函数的一个例子是:
update_selection = function(data){
if(is.null(data)) return(NULL)
updateSelectInput(session
,"monthSelect"
,selected=data$x_)
}
我通过 ggvis() %>% handle_click(update_selection(data))
将它添加到 ggvis,但我收到错误 Error in func() : could not find function "fun"
。
如何制作反应图?
library(ggvis)
library(dplyr)
library(tidyr)
library(ReporteRs)
data = cocaine
data = within(data,
{
month[month==1] = "January"
month[month==2] = "February"
month[month==3] = "March"
month[month==4] = "April"
month[month==5] = "May"
month[month==6] = "June"
month[month==7] = "July"
month[month==8] = "August"
month[month==9] = "September"
month[month==10] = "October"
month[month==11] = "November"
month[month==12] = "December"
}
)
server = function(input, output, session){
selectedState = reactive(input$stateSelect)
plotData = reactive({
data %>%
group_by(state,month) %>%
summarise(avgPotency = mean(potency)) %>%
ungroup() %>%
spread(month,avgPotency) %>%
mutate(January = ifelse(is.na(January),0,January)
,February = ifelse(is.na(February),0,February)
,March = ifelse(is.na(March),0,March)
,April = ifelse(is.na(April),0,April)
,May = ifelse(is.na(May),0,May)
,June = ifelse(is.na(June),0,June)
,July = ifelse(is.na(July),0,July)
,August = ifelse(is.na(August),0,August)
,September = ifelse(is.na(September),0,September)
,October = ifelse(is.na(October),0,October)
,November = ifelse(is.na(November),0,November)
,December = ifelse(is.na(December),0,December)
) %>%
filter(state==selectedState()) %>%
gather("month","AvgPotency",-state)
})
stateVis = reactive({
plotData() %>%
ggvis(x=~month,y=~AvgPotency)
})
stateVis %>% bind_shiny("cocaineCounts")
selectedMonth = reactive(input$monthSelect)
tableData = reactive({
data %>%
filter(state==selectedState() & month==selectedMonth())
})
output$cocaineTable = renderUI({
MyFTable = FlexTable(tableData(),
header.cell.props = cellProperties( padding = 2 ),
body.cell.props = cellProperties( padding = 2 ))
return(HTML(as.html(MyFTable)))
})
}
ui = shinyUI(
fluidPage(
column(6,
selectInput("stateSelect",label="Select a State:",choices = unique(data$state),selected=1)
,selectInput("monthSelect",label="Select a Month:",choices = c('January','February','March','April','May','June','July','August','September','October','November','December'),selected=1)
,ggvisOutput("cocaineCounts")
)
,column(6,
uiOutput(outputId = "cocaineTable")
)
)
)
shinyApp(ui = ui, server = server)
函数需要更新以接受三个参数:
update_selection = function(data,location,session){
if(is.null(data)) return(NULL)
updateSelectInput(session
,"monthSelect"
,selected=data$x_)
}
和 handle_click() 需要作为 ggvis() %>% handle_click(update_selection)
所以完整的工作应用程序是:
library(ggvis)
library(dplyr)
library(tidyr)
library(ReporteRs)
data = cocaine
data = within(data,
{
month[month==1] = "January"
month[month==2] = "February"
month[month==3] = "March"
month[month==4] = "April"
month[month==5] = "May"
month[month==6] = "June"
month[month==7] = "July"
month[month==8] = "August"
month[month==9] = "September"
month[month==10] = "October"
month[month==11] = "November"
month[month==12] = "December"
}
)
update_selection = function(data,location,session){
if(is.null(data)) return(NULL)
updateSelectInput(session
,"monthSelect"
,selected=data$x_)
}
server = function(input, output, session){
selectedState = reactive(input$stateSelect)
plotData = reactive({
data %>%
group_by(state,month) %>%
summarise(avgPotency = mean(potency)) %>%
ungroup() %>%
spread(month,avgPotency) %>%
mutate(January = ifelse(is.na(January),0,January)
,February = ifelse(is.na(February),0,February)
,March = ifelse(is.na(March),0,March)
,April = ifelse(is.na(April),0,April)
,May = ifelse(is.na(May),0,May)
,June = ifelse(is.na(June),0,June)
,July = ifelse(is.na(July),0,July)
,August = ifelse(is.na(August),0,August)
,September = ifelse(is.na(September),0,September)
,October = ifelse(is.na(October),0,October)
,November = ifelse(is.na(November),0,November)
,December = ifelse(is.na(December),0,December)
) %>%
filter(state==selectedState()) %>%
gather("month","AvgPotency",-state)
})
stateVis = reactive({
plotData() %>%
ggvis(x=~month,y=~AvgPotency) %>%
handle_click(update_selection)
})
stateVis %>% bind_shiny("cocaineCounts")
selectedMonth = reactive(input$monthSelect)
tableData = reactive({
data %>%
filter(state==selectedState() & month==selectedMonth())
})
output$cocaineTable = renderUI({
MyFTable = FlexTable(tableData(),
header.cell.props = cellProperties( padding = 2 ),
body.cell.props = cellProperties( padding = 2 ))
return(HTML(as.html(MyFTable)))
})
}
ui = shinyUI(
fluidPage(
column(6,
selectInput("stateSelect",label="Select a State:",choices = unique(data$state),selected=1)
,selectInput("monthSelect",label="Select a Month:",choices = c('January','February','March','April','May','June','July','August','September','October','November','December'),selected=1)
,ggvisOutput("cocaineCounts")
)
,column(6,
uiOutput(outputId = "cocaineTable")
)
)
)
shinyApp(ui = ui, server = server)