如果我有一个相当耗时的分析,那么我们假设将模型拟合到某些数据集。我想显示模型拟合的所有输出,比如说会有renderPlot(),renderTable(),renderText()等。如何使用只运行一次的模型渲染所有这些?我当前的代码如下所示:
shinyServer(function(input, output,session) {
output$twang_diagplot <- renderPlot({
if(is.null(data())|input$twang_x=='.'|input$twang_y=='.') return(NULL)
else{
formula <- paste(input$twang_y, "~",paste(input$twang_x,collapse='+'))
ps_fit <- ps(as.formula(formula),data=workdata(),verbose=FALSE)
plot(ps_fit)
}
})
output$twang_summary <- renderPrint({
if(is.null(data())|input$twang_x=='.'|input$twang_y=='.') return(NULL)
else{
formula <- paste(input$twang_y, "~",paste(input$twang_x,collapse='+'))
ps_fit <- ps(as.formula(formula),data=workdata(),verbose=FALSE)
ps_balance <- bal.table(ps_fit)
print(ps_balance)
}
})
})
在上面的例子中,我不得不两次调用ps()函数来分别生成plot和summary。这是非常低效的。我知道应该有一个函数,比如reactive()或observe(),我可以用它来调用ps()函数将两个渲染函数包装在一起,但我不知道如何使用它。 非常感谢您的帮助! 问候
shinyServer(function(input, output,session) {
getPsFit <- reactive({
formula <- paste(input$twang_y, "~",paste(input$twang_x,collapse='+'))
ps_fit <- ps(as.formula(formula),data=workdata(),verbose=FALSE)
ps_fit
})
output$twang_diagplot <- renderPlot({
if(is.null(data())|input$twang_x=='.'|input$twang_y=='.') return(NULL)
else{
ps_fit <- getPsFit()
plot(ps_fit)
}
})
output$twang_summary <- renderPrint({
if(is.null(data())|input$twang_x=='.'|input$twang_y=='.') return(NULL)
else{
ps_fit <- getPsFit()
ps_balance <- bal.table(ps_fit)
print(ps_balance)
}
})
})
答案 0 :(得分:4)
看起来对ps()
的两次调用使用的是不同的参数,所以我不确定你是否可以在这种情况下使用被动反应只会被调用一次,因为ps
必须是两次打电话,我没有看到解决方法......
PS。你的代码可以从更多的间距中受益,使其更具可读性:)
在评论后修改:
你读过Shiny tutorial, specifically the section of reactive expressions?了吗?
这样的事情应该有效
getPsFit <- reactive({
formula <- paste(input$twang_y, "~",paste(input$twang_x,collapse='+'))
ps_fit <- ps(as.formula(formula),data=workdata(),verbose=FALSE)
ps_fit
})
现在只需用ps_fit <- getPsFit()