反应性数据,转换和覆盖

时间:2018-09-28 12:24:48

标签: r shiny

我对R Shiny还是很陌生,而反应式数据集存在一些问题。

我的想法是,加载数据集,对其进行一些计算,然后打印结果。如果将数据集设置为

,这没有问题

df <- reactive({data.frame(mtcars)}) df_transformed <- reactive({data.frame(tapply(mt$hp, mt$cyl, mean), names(tapply(mt$hp, mt$cyl, mean))))}

但是现在我无法以有意义的方式覆盖初始数据集。我在堆栈溢出中进行了一点搜索,只找到了两个问题之一的howTos,它们彼此排斥。

我想有这样的东西,但是可以工作:

 server <- function(input, output) {

  vals <- reactiveValues()

  ## Create a reactive value dataset
  vals$mt <- data.frame(mtcars)

  ## Create a transformed set out of it


  vals$mt_transformed <- data.frame(tapply(mt$hp, vals$mt$cyl, mean),
                                    names(tapply(vals$mt$hp, vals$mt$cyl, mean)))

  names(vals$mt_transformed) <- c("hp", "cyl")

  ## Transform the initial dataset, via deleting the last row
  observeEvent(input$delete, {
    vals$mt <- vals$mt[-nrow(vals$mt),]
    })

  ## lets hope the plot changes everytime I delete a car
  output$plot <- renderPlot({
    ggplot(vals$mt_transformed) +
      geom_bar(
        aes(x = cyl, y = hp ),
        stat = "identity"
      )
  })
  # 

}

为了完整性:

library(shiny)
library(ggplot2)
ui <- fluidPage(
  actionButton(inputId = "delete", label = "destroy car"),
  plotOutput("plot")

   )

提前谢谢 马库斯

1 个答案:

答案 0 :(得分:1)

让它自己工作。

server <- function(input, output) {

  vals <- reactiveValues()

  ## Create a reactive value dataset 
  vals$mt <- data.frame(mtcars)

  ## Create a transformed set out of it

  mt_transformed <- reactive({
          df <- vals$mt
          mt_transformed <- data.frame(tapply(df$hp, df$cyl, mean),
                  names(tapply(df$hp, df$cyl, mean)))
          names(mt_transformed) <- c("hp", "cyl")
          return( mt_transformed)
        })

  ## Transform the initial dataset, via deleting the last row
  observeEvent(input$delete, {
    vals$mt <- vals$mt[-nrow(vals$mt),]
    })

  ## lets hope the plot changes everytime I delete a car
  output$plot <- renderPlot({
    ggplot(mt_transformed()) +
      geom_bar( aes(x = cyl, y = hp ), stat = "identity" )
    }) 

}