Код для реактивной таблицы для построения в Shiny - PullRequest
2 голосов
/ 05 апреля 2019

Я новичок в Блестящем, и я пытаюсь сделать простой график плотности, где есть 2 группы данных с реактивными «сдвигами» в среднем и т. Д. Упрощенная сводка этого состоит в том, что один набор данных имеетсреднее значение 0 и дисперсия 1. Второй набор данных имеет среднее значение shift, которое определено в ползунке.

Я пытался использовать reactiveValues, как показано в кодениже для хранения матрицы наблюдений d1, сгенерированной из функции density значений y, а соответствующие значения x сохраняются в x.


library(shiny)

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

   # Application title
   titlePanel("Old Faithful Geyser Data"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
         sliderInput("shift",
                     "shift of 2nd set",
                     min = -1,
                     max = 1,
                     value = 0)
      ),

      # Show a plot of the generated distribution
      mainPanel(
         plotOutput("distPlot")
      )
   )
)

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

     d1 <- matrix(nrow=100, ncol=512)
     for(i in 1:70){
       d1[i,] <- density(rnorm(1000),from = -3, to = 3)$y
     }
     for(i in 71:100){
       d1[i,] <- density(rnorm(1000, input$shift),from = -3, to = 3)$y
     }
     x <- density(rnorm(1000),from = -3, to = 3)$x

   })
   output$distPlot <- renderPlot({
      matplot(data$x, t(data$d1), type = "l", lty = 1, col = c(rep(1,70),rep(2,30)))
   })
}

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

Приведенный выше код в основном взят из примера блестящего приложения, поэтому прошу прощения за любые общие ссылки.Это должно все еще работать.

Я ожидал блестящего графика с ползунком слева и графиком справа с 100 линиями плотности в 2 цветах.При изменении ползунка shift второй набор данных (красный) будет перемещаться влево или вправо в зависимости от сдвига.

Вместо этого я получаю сообщение об ошибке

  55: stop
  54: .getReactiveEnvironment()$currentContext
  53: .subset2(x, "impl")$get
  52: $.reactivevalues
  47: server [/beavis/Documents/test/app.R#37]
Error in .getReactiveEnvironment()$currentContext() : 
  Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)

Кто-нибудьв состоянии помочь мне исправить этот код?Любая помощь будет оценена.Проиграв около часа, я думаю, что проблема заключается в разделе reactiveValues, но пока ничего не помогло.

1 Ответ

3 голосов
/ 05 апреля 2019

Хорошая попытка.Ты совсем близко.То, что вам не хватает, это две вещи.Вы создаете объект data, который становится реактивным (вместо него я использую reactive).Это означает, что всякий раз, когда вы звоните data, вы должны называть его как data().

Во-вторых, ваш data возвращает только x.Вывод этой реактивной среды в вашем случае должен быть списком x и d1.

enter image description here

library(shiny)

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

  # Application title
  titlePanel("Old Faithful Geyser Data"),

  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("shift",
                  "shift of 2nd set",
                  min = -1,
                  max = 1,
                  value = 0, 
                  step = 0.1)  # I added a step
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("distPlot")
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  # This reactive environment can be accessed using data().
  data <- reactive({
    d1 <- matrix(nrow=100, ncol=512)
    for(i in 1:70){
      d1[i,] <- density(rnorm(1000),from = -3, to = 3)$y
    }
    for(i in 71:100){
      d1[i,] <- density(rnorm(1000, input$shift),from = -3, to = 3)$y
    }
    x <- density(rnorm(1000), from = -3, to = 3)$x
    list(x = x, d1 = d1)  # make sure that all objects are returned
  })

  output$distPlot <- renderPlot({
    matplot(data()$x, t(data()$d1), type = "l", lty = 1, col = c(rep(1,70),rep(2,30)))
  })
}

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