ggvis 与 Shiny 的集成
ggvis integration with Shiny
这是一个相当简单的问题。我阅读了其他主题,发现要将 GGVIS 可视化插入 Shiny,您需要:
- 在
ui.R
- 调用 ggvisOutput("EvolucionVisitas")
- 在
server.R
中-使用函数bind_shiny("EvolucionVisitas")
我在为我的选项卡 "Evolución Visitas" 绘制图表时遇到问题。
我都做了,但我在某处失败了。
我的选项卡中没有打印任何内容:EvoluciónVisitas。其他都还好。
这是我的数据:
structure(list(date = structure(1:31, .Label = c("2014-12-01",
"2014-12-02", "2014-12-03", "2014-12-04", "2014-12-05", "2014-12-06",
"2014-12-07", "2014-12-08", "2014-12-09", "2014-12-10", "2014-12-11",
"2014-12-12", "2014-12-13", "2014-12-14", "2014-12-15", "2014-12-16",
"2014-12-17", "2014-12-18", "2014-12-19", "2014-12-20", "2014-12-21",
"2014-12-22", "2014-12-23", "2014-12-24", "2014-12-25", "2014-12-26",
"2014-12-27", "2014-12-28", "2014-12-29", "2014-12-30", "2014-12-31"
), class = "factor"), sessions = c(1932L, 1828L, 2349L, 8192L,
3188L, 3277L, 2846L, 2541L, 5434L, 4290L, 2059L, 2080L, 2111L,
3776L, 1989L, 1844L, 3641L, 1283L, 1362L, 1568L, 2882L, 1212L,
957L, 851L, 928L, 1435L, 1115L, 1471L, 1128L, 1022L, 768L), id = 1:31), .Names = c("date",
"sessions", "id"), row.names = c(NA, -31L), drop = TRUE, class = c("tbl_df",
"tbl", "data.frame"))
这是我的代码,谢谢。
ui.R
library(shiny)
library(ggvis)
# Define the overall UI
shinyUI(
# Use a fluid Bootstrap layout
fluidPage(
# Give the page a title
br(),
br(),
titlePanel("Visitas por fuente"),
# Generate a row with a sidebar
sidebarLayout(
# Define the sidebar with one input
sidebarPanel(
dateRangeInput("dates", label = h3("Date range"),
start = "2014-12-01", end = "2014-12-31")
),
mainPanel(
tabsetPanel(
tabPanel('Visitas por fuente',
plotOutput("VisitasFuente")),
tabPanel('Evolución de las visitas',
ggvisOutput("EvolucionVisitas")),
tabPanel('Comentarios',
dataTableOutput("Comentarios"))
)
)
)
))
server.R
library(shiny)
library(ggvis)
Visitas_Por_Fuente <- read.csv("D:\RCoursera\Star-App-2\Visitas_Por_Fuente_Dic.csv")
labelsF = c("Directo", "Email", "Referencias", "SEO", "Social Media", "Campañas", "Adwords")
Visitas_Por_Fuente$date <- as.Date(Visitas_Por_Fuente$date)
ComentariosDic <- read.csv("D:\RCoursera\Star-App-2\ComentariosDic2014.csv",header = TRUE, sep = ";")
ComentariosDic$date <- as.Date(ComentariosDic$date)
shinyServer(
function(input, output) {
output$VisitasFuente <- renderPlot({
# Filter the data based on user selection month
date_seq <- seq(input$dates[1], input$dates[2], by = "day")
VisitasData <- filter(Visitas_Por_Fuente, date %in% date_seq & Fuentes %in% labelsF)
VisitasData <- VisitasData %>% group_by(Fuentes) %>%
summarise(sessions = sum(sessions))
# Bar graph using ggplot2 library
ggplot(VisitasData, aes(factor(Fuentes), sessions, fill = Fuentes)) +
geom_bar(stat="identity", position = "dodge") +
geom_text(aes(label = comma(sessions)), position=position_dodge(width=0.9), vjust=-0.25) +
scale_fill_manual(breaks = c("0", "1", "3", "6", "9", "12", "15"),
labels = labelsF,
values = c("#E69F00", "#56B4E9", "#009E73",
"#F0E442", "#0072B2", "#A082F8", "#F072A2"))
})
**############# Evolución de las visitas ##############################################
#####################################################################################**
output$EvolucionVisitas <- renderPlot({
# Filter the data based on user selection month
date_seq <- seq(input$dates[1], input$dates[2], by = "day")
EvolucionVisitas <- filter(Visitas_Por_Fuente, date %in% date_seq)
mysessions <- function(x) {
if(is.null(x)) return(NULL)
#notice below the id column is how ggvis can understand which session to show
row <- EvolucionVisitas[EvolucionVisitas$id == x$id, ]
#prettyNum shows the number with thousand-comma separator
paste0("Sessions:", " ",prettyNum(row$sessions, big.mark=",",scientific=F))
}
EvolucionVisitas %>%
ggvis(x= ~date, y= ~sessions, key := ~id) %>%
layer_points() %>%
add_tooltip(mysessions ,"hover") %>%
layer_paths() %>%
add_axis("x", value=c(as.character(EvolucionVisitas$date[1]),as.character(EvolucionVisitas$date[round(length(EvolucionVisitas$date)/2,0)]),
as.character(tail(EvolucionVisitas$date, n=1)))) %>%
bind_shiny("EvolucionVisitas")
#####################################################################################
#####################################################################################
output$Comentarios = renderDataTable({
date_seq <- seq(input$dates[1], input$dates[2], by = "day")
ComentariosDic <- filter(ComentariosDic, date %in% date_seq)
ComentariosDic <- filter(ComentariosDic, !grepl("^$", Comentarios))
})
})
server.R 中的代码从哪里开始
output$EvolucionVisitas <- renderPlot({
您可以尝试将其包装在像这样的反应式中,而不是 renderPlot
:
vis <- reactive({
# Filter the data based on user selection month
date_seq <- seq(input$dates[1], input$dates[2], by = "day")
EvolucionVisitas <- filter(Visitas_Por_Fuente, date %in% date_seq)
mysessions <- function(x) {
if(is.null(x)) return(NULL)
#notice below the id column is how ggvis can understand which session to show
row <- EvolucionVisitas[EvolucionVisitas$id == x$id, ]
#prettyNum shows the number with thousand-comma separator
paste0("Sessions:", " ",prettyNum(row$sessions, big.mark=",",scientific=F))
}
myvis <-
ggvis(x= ~date, y= ~sessions, key := ~id) %>%
layer_points() %>%
add_tooltip(mysessions ,"hover") %>%
layer_paths() %>%
add_axis("x",
value=c(as.character(EvolucionVisitas$date[1]),as.character(EvolucionVisitas$date[round(length(EvolucionVisitas$date)/2,0)]),
as.character(tail(EvolucionVisitas$date, n=1))))
myvis
})
然后在反应式之外:
vis %>% bind_shiny("EvolucionVisitas")
我想我在做 shiny/ggvis 时记得类似的事情 - 我的代码在我的 github 上:https://github.com/jalapic/shinyapps/tree/master/soccerteams 它可能会有帮助。
仅对 ggvis 进行故障排除,您的问题主要是由于您尝试自定义 x 轴造成的。 ggvis
试图通过将日期解释为时间来变得聪明。为了这个情节的目的,我认为最好将它们视为因素。
这是一个完整的可重现的答案。
shiny::runGist("https://gist.github.com/cdeterman/0ac102cd68a7987a8a90")
您会注意到其他一些差异。最好使您的数据集具有反应性,这样您就可以在多个地方重用它而无需额外的开销。此外,正如@jalapic 最初建议的那样,您想使 ggvis
对象具有反应性,以便情节可以是动态的并使用漂亮的工具提示。
哇...有点乱。我把它剥离到 ggvis 部分并试图得到它 运行ning。在这个 gist 中查看。
您可以运行它:
shiny::runGist("https://gist.github.com/corynissen/f75ecae388f81be13436")
这是一个相当简单的问题。我阅读了其他主题,发现要将 GGVIS 可视化插入 Shiny,您需要:
- 在
ui.R
- 调用ggvisOutput("EvolucionVisitas")
- 在
server.R
中-使用函数bind_shiny("EvolucionVisitas")
我在为我的选项卡 "Evolución Visitas" 绘制图表时遇到问题。 我都做了,但我在某处失败了。
我的选项卡中没有打印任何内容:EvoluciónVisitas。其他都还好。
这是我的数据:
structure(list(date = structure(1:31, .Label = c("2014-12-01",
"2014-12-02", "2014-12-03", "2014-12-04", "2014-12-05", "2014-12-06",
"2014-12-07", "2014-12-08", "2014-12-09", "2014-12-10", "2014-12-11",
"2014-12-12", "2014-12-13", "2014-12-14", "2014-12-15", "2014-12-16",
"2014-12-17", "2014-12-18", "2014-12-19", "2014-12-20", "2014-12-21",
"2014-12-22", "2014-12-23", "2014-12-24", "2014-12-25", "2014-12-26",
"2014-12-27", "2014-12-28", "2014-12-29", "2014-12-30", "2014-12-31"
), class = "factor"), sessions = c(1932L, 1828L, 2349L, 8192L,
3188L, 3277L, 2846L, 2541L, 5434L, 4290L, 2059L, 2080L, 2111L,
3776L, 1989L, 1844L, 3641L, 1283L, 1362L, 1568L, 2882L, 1212L,
957L, 851L, 928L, 1435L, 1115L, 1471L, 1128L, 1022L, 768L), id = 1:31), .Names = c("date",
"sessions", "id"), row.names = c(NA, -31L), drop = TRUE, class = c("tbl_df",
"tbl", "data.frame"))
这是我的代码,谢谢。
ui.R
library(shiny)
library(ggvis)
# Define the overall UI
shinyUI(
# Use a fluid Bootstrap layout
fluidPage(
# Give the page a title
br(),
br(),
titlePanel("Visitas por fuente"),
# Generate a row with a sidebar
sidebarLayout(
# Define the sidebar with one input
sidebarPanel(
dateRangeInput("dates", label = h3("Date range"),
start = "2014-12-01", end = "2014-12-31")
),
mainPanel(
tabsetPanel(
tabPanel('Visitas por fuente',
plotOutput("VisitasFuente")),
tabPanel('Evolución de las visitas',
ggvisOutput("EvolucionVisitas")),
tabPanel('Comentarios',
dataTableOutput("Comentarios"))
)
)
)
))
server.R
library(shiny)
library(ggvis)
Visitas_Por_Fuente <- read.csv("D:\RCoursera\Star-App-2\Visitas_Por_Fuente_Dic.csv")
labelsF = c("Directo", "Email", "Referencias", "SEO", "Social Media", "Campañas", "Adwords")
Visitas_Por_Fuente$date <- as.Date(Visitas_Por_Fuente$date)
ComentariosDic <- read.csv("D:\RCoursera\Star-App-2\ComentariosDic2014.csv",header = TRUE, sep = ";")
ComentariosDic$date <- as.Date(ComentariosDic$date)
shinyServer(
function(input, output) {
output$VisitasFuente <- renderPlot({
# Filter the data based on user selection month
date_seq <- seq(input$dates[1], input$dates[2], by = "day")
VisitasData <- filter(Visitas_Por_Fuente, date %in% date_seq & Fuentes %in% labelsF)
VisitasData <- VisitasData %>% group_by(Fuentes) %>%
summarise(sessions = sum(sessions))
# Bar graph using ggplot2 library
ggplot(VisitasData, aes(factor(Fuentes), sessions, fill = Fuentes)) +
geom_bar(stat="identity", position = "dodge") +
geom_text(aes(label = comma(sessions)), position=position_dodge(width=0.9), vjust=-0.25) +
scale_fill_manual(breaks = c("0", "1", "3", "6", "9", "12", "15"),
labels = labelsF,
values = c("#E69F00", "#56B4E9", "#009E73",
"#F0E442", "#0072B2", "#A082F8", "#F072A2"))
})
**############# Evolución de las visitas ##############################################
#####################################################################################**
output$EvolucionVisitas <- renderPlot({
# Filter the data based on user selection month
date_seq <- seq(input$dates[1], input$dates[2], by = "day")
EvolucionVisitas <- filter(Visitas_Por_Fuente, date %in% date_seq)
mysessions <- function(x) {
if(is.null(x)) return(NULL)
#notice below the id column is how ggvis can understand which session to show
row <- EvolucionVisitas[EvolucionVisitas$id == x$id, ]
#prettyNum shows the number with thousand-comma separator
paste0("Sessions:", " ",prettyNum(row$sessions, big.mark=",",scientific=F))
}
EvolucionVisitas %>%
ggvis(x= ~date, y= ~sessions, key := ~id) %>%
layer_points() %>%
add_tooltip(mysessions ,"hover") %>%
layer_paths() %>%
add_axis("x", value=c(as.character(EvolucionVisitas$date[1]),as.character(EvolucionVisitas$date[round(length(EvolucionVisitas$date)/2,0)]),
as.character(tail(EvolucionVisitas$date, n=1)))) %>%
bind_shiny("EvolucionVisitas")
#####################################################################################
#####################################################################################
output$Comentarios = renderDataTable({
date_seq <- seq(input$dates[1], input$dates[2], by = "day")
ComentariosDic <- filter(ComentariosDic, date %in% date_seq)
ComentariosDic <- filter(ComentariosDic, !grepl("^$", Comentarios))
})
})
server.R 中的代码从哪里开始
output$EvolucionVisitas <- renderPlot({
您可以尝试将其包装在像这样的反应式中,而不是 renderPlot
:
vis <- reactive({
# Filter the data based on user selection month
date_seq <- seq(input$dates[1], input$dates[2], by = "day")
EvolucionVisitas <- filter(Visitas_Por_Fuente, date %in% date_seq)
mysessions <- function(x) {
if(is.null(x)) return(NULL)
#notice below the id column is how ggvis can understand which session to show
row <- EvolucionVisitas[EvolucionVisitas$id == x$id, ]
#prettyNum shows the number with thousand-comma separator
paste0("Sessions:", " ",prettyNum(row$sessions, big.mark=",",scientific=F))
}
myvis <-
ggvis(x= ~date, y= ~sessions, key := ~id) %>%
layer_points() %>%
add_tooltip(mysessions ,"hover") %>%
layer_paths() %>%
add_axis("x",
value=c(as.character(EvolucionVisitas$date[1]),as.character(EvolucionVisitas$date[round(length(EvolucionVisitas$date)/2,0)]),
as.character(tail(EvolucionVisitas$date, n=1))))
myvis
})
然后在反应式之外:
vis %>% bind_shiny("EvolucionVisitas")
我想我在做 shiny/ggvis 时记得类似的事情 - 我的代码在我的 github 上:https://github.com/jalapic/shinyapps/tree/master/soccerteams 它可能会有帮助。
仅对 ggvis 进行故障排除,您的问题主要是由于您尝试自定义 x 轴造成的。 ggvis
试图通过将日期解释为时间来变得聪明。为了这个情节的目的,我认为最好将它们视为因素。
这是一个完整的可重现的答案。
shiny::runGist("https://gist.github.com/cdeterman/0ac102cd68a7987a8a90")
您会注意到其他一些差异。最好使您的数据集具有反应性,这样您就可以在多个地方重用它而无需额外的开销。此外,正如@jalapic 最初建议的那样,您想使 ggvis
对象具有反应性,以便情节可以是动态的并使用漂亮的工具提示。
哇...有点乱。我把它剥离到 ggvis 部分并试图得到它 运行ning。在这个 gist 中查看。
您可以运行它:
shiny::runGist("https://gist.github.com/corynissen/f75ecae388f81be13436")