Закрытие функций в Shiny - PullRequest
       10

Закрытие функций в Shiny

0 голосов
/ 17 января 2019

Я относительно новичок в работе с блестящим, но у меня довольно хорошее понимание основы R. Я использую замыкания изрядного количества в моем коде и собрал приведенный ниже пример, который показывает, что использование функции "force" необходимо для получения желаемый эффект:

library(shiny)

ui <- fluidPage(

   titlePanel("Lazy Eval/ Closures in Shiny"),

   sidebarLayout(
      sidebarPanel(
         numericInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30)
      ),

      mainPanel(
         verbatimTextOutput("value"),
         verbatimTextOutput("value2"),
         verbatimTextOutput("value3")
      )
   )
)

funcFactory <- function(x){
  function(){
    x 
  }
}

funcFactoryForce <- function(x){
  force(x)
  function(){
    x 
  }
}

server <- function(input, output) {

  f <- reactive({
    .f <- funcFactory(input$bins)
    .f
  })

  f2 <- reactive({
    .f <- funcFactoryForce(input$bins)
    .f
  })

  output$value <- renderText({
    input$bins
  })

  output$value2 <- renderPrint({
    req(input$bins)
    list(f()(), environment(f()))
  })

  output$value3 <- renderPrint({
    req(input$bins)
    list(f2()(), environment(f2()))
  })

}    
shinyApp(ui = ui, server = server)

Чтобы зафиксировать изменение пользователя на входе "bin", мне нужно принудительно оценить x, чтобы приложение создало функцию, которая возвращает обновленное значение. Мой вопрос: следует ли вообще всегда применять силу всякий раз, когда создается замыкание (вне контекста блестящего приложения), или я что-то упускаю из-за того, как работает реактивность?

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