Я относительно новичок в работе с блестящим, но у меня довольно хорошее понимание основы 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, чтобы приложение создало функцию, которая возвращает обновленное значение. Мой вопрос: следует ли вообще всегда применять силу всякий раз, когда создается замыкание (вне контекста блестящего приложения), или я что-то упускаю из-за того, как работает реактивность?