将单选按钮值传递给过滤器

时间:2019-07-11 09:50:50

标签: r dataframe shiny

我有以下数据:-

   Var1            Freq year
1 United States 600015 1906
2 United States 533209 1811
3 China         465852 1906
4 China         438228 1811
5 Japan         117248 1906
6 Japan         109436 1811
7 France         67183 1906
8 Germany        60503 1811
9 Germany        59140 1906
10 France         43580 1811

所以我想绘制一个由1811和1906单选按钮组成的条形图,选择单选按钮1811应该打印处理后的数据框和带有1811值的数据条形图。

我正在尝试使用以下代码

ui <- fluidPage(
    titlePanel(h1("Chart", align = "center", style = "color:black")),
    sidebarLayout(
    sidebarPanel(
    radioButtons("radio","Radio buttons",choices = list("1906" = 1906, "1811" = 1811),selected = 1906),
    actionButton("goButton","Analyze")),
    mainPanel(
    fluidRow(splitLayout(cellWidths = c("50%", "100%"),DT::dataTableOutput("mytable"),plotOutput("Plot",height=550)))
    )))

server <- function(input, output) {

    #yrdt <- filter(all_datay, all_datay$year %in% c('1906',''))
    yrdt <- filter(all_datay, all_datay$year %in% c('input$radio')
    pltyrdt <- head(yrdt,10)

    output$mytable = DT::renderDataTable({
    datatable(yrdt, class = 'cell-border stripe', colnames = c('Rank', 'Country', 'Freq', 'Year'))})

    output$Plot <- renderPlot({
            input$goButton
    barplot(pltyrdt$Freq,names.arg=pltyrdt$Var1,horiz=F,xlab="Country",ylab="Freq", yaxs="i", xaxs="i")})

    output$value <- renderPrint({ input$radio })
    }
shinyApp(ui, server)

我遇到以下错误

  

错误:需要有限的“ xlim”值。

任何人都可以帮助我。

如果我仅选择1906年的数据,则输出如下图所示。

enter image description here

1 个答案:

答案 0 :(得分:0)

有很多问题。

  • 'input$radio'用引号引起来。它是一个字符串,字面上是input$radio(而不是值)。如果您删除引号('),则会收到一条错误消息,告诉您实际上是什么问题,即
  • 您尝试在反应性环境之外使用input$radio

基本上,您在服务器设置过程中调用了一次filter函数,并要求它获取年等于input$radio的所有行(不是反应变量input$radio的内容,但是文字字符串input$radio)。因此,yrdt为空。

这里是一种选择:

server <- function(input, output) {

    yrdt <- function() { filter(all_datay, all_datay$year %in% input$radio) }

    output$mytable = DT::renderDataTable({ 
      datatable(yrdt(), class = 'cell-border stripe', 
                        colnames = c('Rank', 'Country', 'Freq', 'Year'))})

    output$Plot <- renderPlot({
            input$goButton
            pltyrdt <- head(yrdt(),10)
            barplot(pltyrdt$Freq, 
                    names.arg=pltyrdt$Var1,
                    horiz=F,
                    xlab="Country", ylab="Freq", 
            yaxs="i", xaxs="i")
    })

    output$value <- renderPrint({ input$radio })

}

这里发生的是定义一个可以计算选择的函数,并在需要时调用该函数。由于它是在反应性环境(例如renderPlot())中调用的,因此input$radio可以正常工作。

或者,您可以将yrdt定义为反应表达式:

yrdt <- reactive({filter(all_datay, all_datay$year %in% input$radio) })
...
    pltyrdt <- head(yrdt(),10)

(您可以像使用上面的函数一样使用它)。

有关发光here中反应性环境的更多信息。