2014-09-13 34 views
1

我正在测试需要被动SelectInput的Shinyapp,用户选择一个Transport并且我需要刷新状态字段,我想只显示具有所选传输的状态。我有4种运输方式,International_Long(8个国家),International_Short(2个国家),National_Short(9个国家)和National_Long(所有23个国家)。带有“观察”的交互式菜单

我的代码正在为DataTable工作,但它不适用于剧情!

问题是当您选择“绘图”选项卡时,菜单的反应性会停止并显示所有运输状态。

在此先感谢!

我的应用程序:https://luisotavio.shinyapps.io/rcharts2/

我的数据是在这里:https://drive.google.com/file/d/0B1jMuJ4_u7e-elB4QV9WRkRKdEU/edit?usp=sharing

读取数据

mydata<-read.delim("mydata.txt",sep="\t",dec=",",header=TRUE) 

ui.R

require(rCharts) 
options(RCHART_LIB = 'polycharts') 

shinyUI(
    navbarPage("TEST", 

         tabPanel("Transport Survey", 
           pageWithSidebar(
            headerPanel('Transport Survey'), 
            sidebarPanel(

            selectInput('Transport2', 'Select a Transport:',levels(droplevels(mydata$Transport)),selected=levels(droplevels(mydata$Transport))[1] 
            ), 
            selectInput('State2', 'Select a State:', levels(droplevels(mydata$State)),selected=levels(droplevels(mydata$State))[1] 
            ), 

            width = 3 

           ), 
            mainPanel(
            tabsetPanel(tabPanel("Table",dataTableOutput("mytable")), 
            tabPanel("Plot",showOutput('myplot', 'polycharts'))) 
           ) 
           )   
         ))  

) 

server.R

library(shiny) 
library(rjson) 
library(rCharts) 



options(RCHART_WIDTH = 800) 

shinyServer(function(input, output,session) { 

    observe({ 
    TRANSPORT = input$Transport2 
    updateSelectInput(session, "State2", choices = levels(droplevels(mydata$State[mydata$Transport %in% TRANSPORT])),selected = levels(droplevels(mydata$State[mydata$Transport %in% TRANSPORT]))[1] 
    ) 
    }) 



    selectedData <- reactive({ 
    TRANSPORT = input$Transport2 
    STATE = input$State2 
    mydata[mydata$Transport %in% TRANSPORT & mydata$State %in% STATE,] 

    }) 

    output$mytable = renderDataTable({ 
    selectedData() 
    }) 

    output$myplot<- renderChart2({ 
    mydata2<-selectedData() 

    p1<-rPlot(Value ~ Company, color = 'Company', data = mydata2, type = 'bar') 
    p1$guides(
     color = list(
     numticks = length(levels(droplevels(mydata2$Company))) 
    ), 
     y = list(
     min = 0, 
     max = 10 
    ) 
    ) 
    return(p1) 
    }) 
}) 
+0

这将真正帮助,如果你做,并不需要下载一个重复的例子,(更不用说安装几个包)。你可以从代码中删除部分(模拟一个小数据集而不是使用你的,用简单的数据代替图),并确保问题依然存在。也就是说,这里似乎确实存在一个好奇的问题 – 2014-09-13 03:43:42

回答

1

改变你的反应通过隔离input$Transport2

selectedData <- reactive({ 
    TRANSPORT = isolate(input$Transport2) 
    STATE = input$State2 
    mydata[mydata$Transport %in% TRANSPORT & mydata$State %in% STATE,] 

    }) 

您的观察者已经引进所需的依赖上input$Transport2

observe({ 
    TRANSPORT = input$Transport2 
    updateSelectInput(session, "State2", choices = levels(droplevels(mydata$State[mydata$Transport %in% TRANSPORT])),selected = levels(droplevels(mydata$State[mydata$Transport %in% TRANSPORT]))[1] 
    ) 
    }) 

问题是reactive是懒洋洋地评估和observer是急切地评估。

更好的解决方案是,以验证数据是可用:

selectedData <- reactive({ 
    TRANSPORT = input$Transport2 
    STATE = input$State2 
    out <- mydata[mydata$Transport %in% TRANSPORT & mydata$State %in% STATE,] 
    validate(
     need(nrow(out) > 0, 'no data') 
    ) 
    out 
    }) 
+0

非常感谢。一个多月来我试图解决这个问题! – 2014-09-13 11:06:06

+0

例如,当您将国家:巴伊亚州更改为国际时,您仍然会遇到轻微问题,因为选择巴伊亚州作为第一选择并且不会更改传播。 – jdharrison 2014-09-13 11:09:38

+0

已通过验证数据可用的更好解决方案进行更新。 – jdharrison 2014-09-13 11:51:10