我试图让动态用户界面与googlevis一起工作时遇到一些问题。基本上我想让用户通过滑动条输入感兴趣的范围,并相应地改变绘图。在下面的例子中,我使用了googlevis包中的数据集来说明我的意思。如果您运行下面的代码,则不会出现任何错误,但不会生成任何图表:
ui.R
library(shiny)
shinyUI(fluidPage(
titlePanel("Example"),
sidebarLayout(
sidebarPanel(
radioButtons('data_choice', 'choose a dataset',
choices= c('dataset1', 'dataset2')),
uiOutput('slider')
),
mainPanel(
htmlOutput('view')
)
)
))
server.R
library(shiny)
library(googleVis)
library(ggplot2)
dataset1= dino
dataset2= Fruits[,c(1,6)]
shinyServer(function(input, output) {
#Output new slider depending on dataset chosen
output$slider<- renderUI({
if(input$data_choice== 'dataset1'){
sliderInput('rangeSlider', 'Choose data range',
min= 0, max= max(dataset1$Length),
value= c(0, max(dataset1$Length)))
}else if(input$data_choice== 'dataset2'){
sliderInput('rangeSlider', 'Choose data range',
min= 0, max= max(dataset2$Profit),
value= c(0, max(dataset2$Profit)))
}
})
#plot adjust
adjustPlot<- reactive({
#Adjust dataframes based on input from slider
if(input$data_choice== 'dataset1'){
adjusted_dataset1<- subset(dataset1,
Length >= input$rangeSlider[1] & Length <= input$rangeSlider[2])
}else if(input$data_choice== 'dataset2'){
adjusted_dataset2<- subset(dataset2,
Profit >= input$rangeSlider[1] & Profit <= input$rangeSlider[2])
}
})
output$view <- renderGvis({
gvisBarChart(adjustPlot(), options= list(height= 700))
})
})
如果用ggplot图替换输出而不是googlevis,代码运行正常。
ui.R
mainPanel(
plotOutput('view')
)
server.R
#ggplot that works
output$view <- renderPlot({
if(input$data_choice=='dataset1'){
p<-ggplot(adjustPlot(), aes(x=Dinosaur, y=Length))
p<-p + geom_bar(stat='identity', fill='navyblue') + coord_flip()
}else if(input$data_choice=='dataset2') {
p<-ggplot(adjustPlot(), aes(x=Fruit, y=Profit))
p<-p + geom_bar(stat='identity', fill= 'forestgreen') + coord_flip()
}
print(p)
}, height=550)
当从renderUI获取输入时,似乎存在将谷歌绘图呈现给应用程序的问题(可能因为它将其呈现为html ..)。任何援助将不胜感激。谢谢!
答案 0 :(得分:4)
看起来好像这个问题太受欢迎了,但是由于我花了多少时间试图解决它,我想我发布了我的答案,希望它可以帮助某人路。原始代码有两个问题,我仍然不完全理解,但我想他们是由于gvis图生成的javascript。
首先,renderUI()
中的输入变量对于两个条件(renderSlider1和renderSlider2)必须是不同的:
<强烈> server.R 强>
#Output new slider depending on interested paramter chosen
output$slider<- renderUI({
if(input$data_choice== 'dataset1'){
sliderInput('rangeSlider1', 'Choose data range',
min= 0, max= max(dataset1$Length),
value= c(0, max(dataset1$Length)), round=T)
}else if(input$data_choice== 'dataset2'){
sliderInput('rangeSlider2', 'Choose data range',
min= 0, max= max(dataset2$Profit),
value= c(0, max(dataset2$Profit)), round=T)
}
})
其次,似乎renderUI输入的初始状态为null,导致维度为[0,0]的数据帧,这似乎停止了任何gvis输出;但它似乎不会影响renderPlot()
生成的图。通过向renderGvis()
提供条件参数,它似乎绕过了这个问题:
output$view <- renderGvis({
if(nrow(adjustPlot())!= 0){
chart<-gvisBarChart(adjustPlot(), options= list(height= 700))
return(chart)
}
})
我不知道为什么会这样(我很乐意听到),但这解决了这个问题。 ui.R和server.R的其余部分与上面相同,只需确保更改所有输入变量。希望这有助于某人!