在反应上下文中捕获函数的标准输出和返回值
Capture stdout and returned value of a function in a reactive context
在我闪亮的应用程序中,我有一个函数可以打印一些消息和 return 来自用户输入的值。我想捕捉它的信息和它的价值。一个简单的应用程序是这样的:
library(shiny)
f <- function(val) { # my function
cat(val + 1)
return(val)
}
ui <- fluidPage(
sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30),
verbatimTextOutput("console"),
verbatimTextOutput("result")
)
server <- function(input, output) {
txt <- reactive({ # capture its messages
capture.output({
res <<- f(input$bins) # capture its value
})
})
output$console <- renderPrint(txt())
output$result <- renderPrint(res)
}
shinyApp(ui = ui, server = server)
问题是 output$result
不是反应性的,即它不会随着用户输入而改变。我不知道这样做的正确方法是什么,所以同时我只要求用户重新加载应用程序。
非常感谢。
如果你无法控制f
在做什么,你可以将它和return两个值包装起来:
wrapped_f <- function (val) {
self <- environment()
stdout <- capture.output(self$res <- f(val))
list(res = self$res, stdout = stdout)
}
…您甚至可以直接在反应式表达式中执行相同的操作,而无需创建单独的函数,但是拥有一个函数会使代码更简洁。
在我闪亮的应用程序中,我有一个函数可以打印一些消息和 return 来自用户输入的值。我想捕捉它的信息和它的价值。一个简单的应用程序是这样的:
library(shiny)
f <- function(val) { # my function
cat(val + 1)
return(val)
}
ui <- fluidPage(
sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30),
verbatimTextOutput("console"),
verbatimTextOutput("result")
)
server <- function(input, output) {
txt <- reactive({ # capture its messages
capture.output({
res <<- f(input$bins) # capture its value
})
})
output$console <- renderPrint(txt())
output$result <- renderPrint(res)
}
shinyApp(ui = ui, server = server)
问题是 output$result
不是反应性的,即它不会随着用户输入而改变。我不知道这样做的正确方法是什么,所以同时我只要求用户重新加载应用程序。
非常感谢。
如果你无法控制f
在做什么,你可以将它和return两个值包装起来:
wrapped_f <- function (val) {
self <- environment()
stdout <- capture.output(self$res <- f(val))
list(res = self$res, stdout = stdout)
}
…您甚至可以直接在反应式表达式中执行相同的操作,而无需创建单独的函数,但是拥有一个函数会使代码更简洁。