Самостоятельные итерации Shiny App - решение - PullRequest
0 голосов
/ 03 февраля 2019

В блестящих приложениях может быть сложно использовать итеративные ссылки на себя.

Это вызвало у меня сильную головную боль, но ...

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Предложенное вами решение не является правильным в блестящем, я настоятельно рекомендую не делать этого.Не используйте <<- для назначения, это почти никогда не правильно делать в блестящем, это может «казаться» правильным, но имеет непреднамеренное поведение, которое может привести к странным ошибкам.Обычно, когда вы хотите использовать <<-, правильнее всего использовать reactiveVal().

. Рассмотрим приложение ниже, которое использует <<- для сохранения промежуточной суммы числа (я используюпример приложения, отличный от вашего, чтобы его было проще и легче понять):

ui <- fluidPage(
  actionButton("add1", "Add 1"),
  actionButton("add5", "Add 5")
)
server <- function(input, output) {
  mysum <<- 0

  observeEvent(input$add1, {
    mysum <<- mysum + 1
    print(mysum)
  })
  observeEvent(input$add5, {
    mysum <<- mysum + 5
    print(mysum)
  })
}
shinyApp(ui, server)

Приведенное выше приложение будет работать нормально, когда вы его тестируете, но когда вы производите его в реальном мире, вы заметитеошибка: если вы откроете две вкладки браузера, переменная будет разделена между двумя.На самом деле, число будет общим для всех пользователей.Этого не произойдет в вашем приложении, потому что ваше первоначальное назначение использовало <-, а второе - <<-, но приведенный выше шаблон я часто вижу, поэтому я хотел явно показать его.Другая вещь, которая здесь не так, заключается в том, что теперь вы покинули мир реактивности - mysum не является реактивной переменной, поэтому мы не можем использовать ее в любом реактивном контексте в блестящем (вот почему ваш нерешительный № 2не работал).Ниже представлен лучший подход:

ui <- fluidPage(
    actionButton("add1", "Add 1"),
    actionButton("add5", "Add 5")
)
server <- function(input, output) {
    mysum <- reactiveVal(0)

    observeEvent(input$add1, {
        mysum(mysum() + 1)
    })
    observeEvent(input$add5, {
        mysum(mysum() + 5)
    })
    observe({
        print(mysum())
    })
}
shinyApp(ui, server) 

Вы можете прочитать этот ответ для более подробного обсуждения

0 голосов
/ 03 февраля 2019

Я публикую это, чтобы помочь, если у кого-то еще есть проблемы с попыткой перенести значение из одной «итерации» в следующую в блестящем приложении.

В моем случае мне нужно вычислить среднее значение.

library(shiny)

# UI
{ 
  ui <- fluidPage(
    textOutput('serial')
  )
}

server <- function(input, output, session) {

  serialStream <- reactive({
    invalidateLater(10, session)
    return(sample(1:100,1))
  })

  # Non-solution #1
  # runningMean <- reactive({
  #   isolate(runningMean()*0.4) + serialStream()*0.1
  # })
  # output$serial <- renderText(runningMean())

  # Non-solution #2
  # runningMean <- 0 # initial value
  # observe({
  #   runningMean <<- runningMean*0.4 + serialStream()*0.1
  # })
  # output$serial <- renderText(runningMean)

  # Solution 
  rm <- 0 # initial value
  runningMean <- reactive({
    rm <<- rm * 0.4 + serialStream()*0.1
    rm
  })
  output$serial <- renderText(runningMean())
}

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

Нечто подобное можно выполнить с помощью наблюдений (), но у меня возникли проблемы с утечкой памяти.Приведенный выше код помогает мне ... Обратите внимание на использование << - вместо <- внутри реактивной функции.Это гарантирует, что значение rm сохраняется за пределами этой функции. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...