在反应上下文中捕获函数的标准输出和返回值

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)
}

…您甚至可以直接在反应式表达式中执行相同的操作,而无需创建单独的函数,但是拥有一个函数会使代码更简洁。