передать значение переключателя для фильтрации - PullRequest
0 голосов
/ 11 июля 2019

У меня есть следующие данные: -

   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 голосов
/ 11 июля 2019

Есть несколько проблем.

  • '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)

(вы используете его так же, как и функцию, описанную выше).

Подробнее о реактивной среде в блестящем здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...