【问题标题】:Passing output of reactive function to another reactive function (Shiny)将反应函数的输出传递给另一个反应函数(闪亮)
【发布时间】:2016-02-19 01:27:26
【问题描述】:

我有一个如下所示的数据集(但实际数据集要大得多,并且包含一些额外的列):

"month","year","id","hour","count"
1,2015,"place001",13,10.2319100637371
6,2015,"place001",14,42.2066290129154
10,2015,"place002",18,34.5326964651126
3,2015,"place002",8,23.0217976434084
3,2014,"place002",1,19.184831369507
3,2014,"place003",15,47.322584044784

我正在尝试构建一个闪亮的应用程序来探索这些数据。这是我到目前为止得到的,但是当它尝试处理 quarterly 反应函数时它会中断。如果我使用被注释掉的“冗余”方法,应用程序会正确呈现,但我想避免它。

稍后我还需要使用totals 的输出并使用melt 函数对其进行整形,因此我想了解如何将此反应函数用作另一个反应函数的输入。

非常感谢任何帮助。

ui.R

library(shiny)
library(ggvis)

renderInputs <- function() {
  wellPanel(
    ## Take hour information from user for filtering.
    checkboxGroupInput("hour", "Hours",
                       c("1" = 1,
                         "8" = 8,
                         "13" = 13,
                         "14" = 14,
                         "15" = 15,
                         "18" = 18),
                       selected  = c(1, 8, 13, 15),
                       inline = T)
  )
}

shinyUI(fluidPage(
  titlePanel("Analysis"),

  fluidRow(
    ## Inputs
    column(4, renderInputs()),
    ## Plot data.
    column(8,h2("Monthly Visitors"),
           ggvisOutput("plotM")
    )),
    ## Plot quarterly data.
  fluidRow(
    column(7, h2('Quarterly Summary'),
    ggvisOutput("plotQ"))
    )
))

服务器.R

library(shiny)
library(dplyr)
library(zoo)

data <- read.csv("file.csv")
data$date <- as.yearmon(paste0(data$year, "-", data$month))

shinyServer(function(input, output) {

    totals <- reactive({
      data %>%
        filter(hour %in% input$hour) %>%
        group_by(date) %>%
        summarize(visitors = sum(count))
    })

    ## Quarterly, with "reactive" approach.
    quarterly <- reactive({
      totals() %>%
        mutate(quarter = as.yearqtr(date)) %>%
        group_by(quarter) %>%
        summarize(visitors = sum(count))
    })


    ## Quarterly data and percentage changes (redudant approach).
#    quarterly <- reactive({
#    data %>%
#      filter(hour %in% input$hour) %>%
#      mutate(quarter = as.yearqtr(date)) %>%
#      group_by(quarter) %>%
#      summarize(visitors = sum(count))
#    })

    ## Create estimated quarterly chart.
    visM <- reactive({
      totals() %>%
        ggvis(~as.factor(date), ~visitors) %>%
        layer_points()
    })  

    ## Create estimated quarterly chart.
    visQ <- reactive({
      quarterly() %>%
        ggvis(~as.factor(quarter), ~visitors) %>%
        layer_bars(fill := "green")
    })


    ## Send plots to UI.
    visM %>% bind_shiny("plotM")

    visQ %>% bind_shiny("plotQ")
})

谢谢。

【问题讨论】:

  • 您的totals 数据框不再有count 列,因此您的非冗余方法在summarize(visitors = sum(count)) 失败,请尝试在quaterly 反应块中执行summarize(visitors = sum(visitors))。跨度>
  • Shiny-wise,你做对了。 totals() 应该处理正确的数据集。你能提供错误代码吗?也许totals() 不是您期望的类型。和/或错误在dplyr内。

标签: r shiny dplyr


【解决方案1】:

感谢@NicE,我完全错过了!修复这个愚蠢的错误后,它可以正常工作。也感谢 K. Rohde。

## Quarterly, with "reactive" approach.
quarterly <- reactive({
  totals() %>%
    mutate(quarter = as.yearqtr(date)) %>%
    group_by(quarter) %>%
    summarize(visitors = sum(visitors))
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 2016-01-15
    • 2018-05-29
    • 1970-01-01
    • 2014-02-23
    • 2019-06-16
    • 2018-08-20
    相关资源
    最近更新 更多