R: Передача информации в renderPlot из реактивной функции - PullRequest
0 голосов
/ 16 марта 2020

все. Я очень новичок в Блестящем и R, но пытаюсь научиться проходить через него.

Я мог бы использовать вашу помощь, научившись передавать информацию из реактивной функции в renderPlot. Я успешно использовал свою реактивную функцию для построения фрейма данных, но когда я пытаюсь построить его в renderPlot с помощью ggplot, данные недоступны.

В renderPlot я получаю сообщение об ошибке «объект» товар "не существует". Есть мысли?

server <- function(input, output) 
{
reactive_data <- reactive({

                finalData <- data.frame(ITEM_DESC=as.character(), revenue=double(), product=character())

                for (p in input$product_selection){

                    tempData <- orderData %>%
                        filter(grepl(p, ITM_DESC)) %>%
                        select(ITM_DESC, revenue) %>%
                        group_by(ITM_DESC) %>%
                        summarize(rev=sum(revenue))

                    tempData <- tempData %>% mutate(product = p)

                    if (dim(finalData)[1] == 0) {
                        finalData <- tempData
                    }
                    else{
                        finalData <- bind_rows(finalData, tempData)
                    }
                }

            })

# Render Plot
output$shinyOrders <- renderPlot(
                        ggplot(reactive_data()) +
                        geom_col(aes_string(x="product", y="rev")) +
                        theme_bw(18) +
                        theme(axis.text.x = element_text(angle = 90, hjust = 1))
                        )
}

# ---- Run App ----

shinyApp(ui, server)

1 Ответ

0 голосов
/ 16 марта 2020

for циклы ничего не возвращают. Наблюдайте:

(for (i in 1:3) i <- i+1)
# NULL
i
# [1] 4

Я думаю, что это делает ваше решение (без проверки):

server <- function(input, output) {
  reactive_data <- reactive({

    finalData <- data.frame(ITEM_DESC=as.character(), revenue=double(), product=character())

    for (p in input$product_selection){

      tempData <- orderData %>%
        filter(grepl(p, ITM_DESC)) %>%
        select(ITM_DESC, revenue) %>%
        group_by(ITM_DESC) %>%
        summarize(rev=sum(revenue))

      tempData <- tempData %>% mutate(product = p)

      if (dim(finalData)[1] == 0) {
        finalData <- tempData
      }
      else{
        finalData <- bind_rows(finalData, tempData)
      }
    }

    return(finalData) # <--------- you need this

  })

  # Render Plot
  output$shinyOrders <- renderPlot(
    ggplot(reactive_data()) +
      geom_col(aes_string(x="product", y="rev")) +
      theme_bw(18) +
      theme(axis.text.x = element_text(angle = 90, hjust = 1))
  )
}

# ---- Run App ----

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