R Сверкающие данные недоступны "Ошибка: объект не найден" - PullRequest
0 голосов
/ 29 июня 2018

При построении графиков на графиках в приложении Shiny созданные кадры данных доступны только для первого, но не для второго графика («Ошибка: объект df2 не найден»). Копирование и вставка кода для генерации фреймов данных во вторую часть renderPlot решает проблему, но является избыточной и замедляет работу приложения. Есть ли более элегантный способ сделать данные доступными для нескольких частей renderPlot? Я пытался использовать функцию Shinys реактивной (), но безуспешно.

Вот минимальный пример:

library(shiny)
library(ggplot2)

# Define UI for application that draws a histogram
ui <- fluidPage(

  titlePanel("Utility"),

  sidebarLayout(
    sidebarPanel(
    sliderInput("var1",
                 "N",
                 min = 1,
                 max = 100,
                 value = 20)),
    mainPanel(
      plotOutput("barplot1"),
      plotOutput("barplot2"))))



# Define server logic required to draw a barplot
server <- function(input, output) {

  output$barplot1 <- renderPlot({

  df <- as.data.frame(matrix(c(
                      "A", "1", rnorm(1, input$var1, 1),
                      "A", "2", rnorm(1, input$var1, 1),
                      "B", "1", rnorm(1, input$var1, 1),
                      "B", "2", rnorm(1, input$var1, 1)),
                      nrow = 4, ncol=3, byrow = TRUE))
  df$V3 <- as.numeric(as.character(df$V3))

  df2 <- as.data.frame(matrix(c(
                       "A", "1", rnorm(1, input$var1, df[1,3]),
                       "A", "2", rnorm(1, input$var1, df[1,3]),
                       "B", "1", rnorm(1, input$var1, df[1,3]),
                       "B", "2", rnorm(1, input$var1, df[1,3])),
                       nrow = 4, ncol=3, byrow = TRUE))
  df2$V3 <- as.numeric(as.character(df$V3))

  ggplot(df, aes(x=V1, y=V3, fill=V2)) +
  geom_bar(stat="identity") 

  })

  output$barplot2 <- renderPlot({

  ggplot(df2, aes(x=V1, y=V3, fill=V2)) +
  geom_bar(stat="identity") 

  })
}

# Run the application 
shinyApp(ui = ui, server = server)

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Да, вы никогда не должны дублировать свои данные. Чтобы сделать ваш фрейм данных доступным для всех ваших функций, просто сгенерируйте его динамически, используя reactive (так как это зависит от input$var1). При вызове реактивной переменной x вам нужно использовать x() вместо x. В противном случае вы получите сообщение об ошибке: Error: object of type 'closure' is not subsettable". Так что в вашем случае, чтобы сделать df реактивным, вам потребуется вместо этого использовать df().

server <- function(input, output) {

  df <- reactive(
    data.frame(V1 = c("A", "A", "B", "B"),
               V2 = c("1", "2", "1", "2"),
               V3 = rnorm(1, input$var1, 5)        
               )
  )

  output$barplot1 <- renderPlot({
    ggplot(df(), aes(x=V1, y=V3, fill=V2)) +
      geom_bar(stat="identity") 
  })

  output$barplot2 <- renderPlot({
    ggplot(df(), aes(x=V1, y=V3, fill=V2)) +
      geom_bar(stat="identity") 
  })
}
0 голосов
/ 29 июня 2018

работает над созданием data.frame снаружи в своем реактиве

library(shiny)
library(ggplot2)

# Define UI for application that draws a histogram
ui <- fluidPage(

  titlePanel("Utility"),

  sidebarLayout(
    sidebarPanel(
      sliderInput("var1",
                  "N",
                  min = 1,
                  max = 100,
                  value = 20)),
    mainPanel(
      plotOutput("barplot1"),
      plotOutput("barplot2")
      )
    )
  )



# Define server logic required to draw a barplot
server <- function(input, output) {


  df <- reactive({


    df <-  as.data.frame(matrix(c(
      "A", "1", rnorm(1, input$var1, 1),
      "A", "2", rnorm(1, input$var1, 1),
      "B", "1", rnorm(1, input$var1, 1),
      "B", "2", rnorm(1, input$var1, 1)),
      nrow = 4, ncol=3, byrow = TRUE))
    df$V3 <- as.numeric(as.character(df$V3))

    df

  })

  df2 <- reactive({  

  df2 <- as.data.frame(matrix(c(
    "A", "1", rnorm(1, input$var1, df()[1,3]),
    "A", "2", rnorm(1, input$var1, df()[1,3]),
    "B", "1", rnorm(1, input$var1, df()[1,3]),
    "B", "2", rnorm(1, input$var1, df()[1,3])
    ),
    nrow = 4, ncol=3, byrow = TRUE))
   df2$V3 <- as.numeric(as.character(df()$V3))

  df2
  })

  output$barplot1 <- renderPlot({


    ggplot( df() , aes(x=V1, y=V3, fill=V2)) +
      geom_bar(stat="identity")

  })

  output$barplot2 <- renderPlot({


    ggplot(df2(), aes(x=V1, y=V3, fill=V2)) +
      geom_bar(stat="identity")

  })
}

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