将数据从一个反应部分传递到另一个反射部分

时间:2015-08-04 09:12:41

标签: r shiny dplyr

在下面的闪亮应用中,我想使用dt中来自reactive被叫数据的数据框renderPlot

我通过以下方式尝试了此操作:ggplot(dt, aes(x, y)) + geom_point()ggplot(data(), aes(x, y)) + geom_point()

我无法弄清楚如何将数据帧从一个反应部分转移到另一个反应部分。

修改
我想我通过使用ggplot(data()$dt, aes(x,y) + ...找到了解决方案但现在问题似乎出现在filter包的dplyr中。

任何提示?

服务器:

# server

library(dplyr)
library(shiny)
library(ggplot2)

df <- data.frame(x = rnorm(100), y = rnorm(100)) %>%
  mutate(id = ntile(x, 4))

shinyServer(function(input, output) {


  data <- reactive({

    dt <- dt %>%
      filter(id == input$id)

  })

  output$plot <- renderPlot({

    ggplot(dt, aes(x,y) +
      geom_point()

  })


})

UI:

## ui

library(shiny)
library(ggplot2)

shinyUI(fluidPage(

  sidebarPanel(width = 2,

               selectInput("id", 
                           "Select ID:",
                           c(1:4))

               ),
  mainPanel(width = 10,

            plotOutput("plot")

            )

))

1 个答案:

答案 0 :(得分:4)

您的代码中有一些错误(您提供的内容甚至无法运行),但最重要的是,您必须了解响应的工作原理。我建议再次阅读闪亮的教程,特别是有关反应变量的部分。渲染绘图时,您希望使用data的值,而不是dt的值。

其他错误:

  • 您定义了一个数据框df,但在后续代码中,您使用的是不存在的变量dt
  • 您在ggplot调用
  • 上没有右括号

这是您的代码的工作版本:

df <- data.frame(x = rnorm(100), y = rnorm(100)) %>%
  mutate(id = ntile(x, 4))

runApp(shinyApp(
  ui = fluidPage(
    sidebarPanel(width = 2,

                 selectInput("id", 
                             "Select ID:",
                             c(1:4))

    ),
    mainPanel(width = 10,

              plotOutput("plot")

    )
  ),
  server = function(input, output, session) {

    data <- reactive({

      df <- df %>%
        filter(id == input$id)
      df
    })

    output$plot <- renderPlot({

      ggplot(data(), aes(x,y)) +
               geom_point()

    })

  }
))