如何调整一个表重新计算到一个actionButton点击RShiny应用程序

时间:2017-05-31 06:25:41

标签: r shiny shiny-server shinydashboard

我有以下非常简单的应用

funSolver <- function(server,currencyList,tenorList,tailList) {

return(do.call(rbind,lapply(currencyList,function(ccy) {
    return(do.call(rbind,lapply(tenorList,function(tenor) {
        return(do.call(rbind,lapply(tailList,function(myTail) {
            a <- 0
            b <- 10
            d <- 25
            e <- 35
            return(data.frame(ccy=ccy,tenor=tenor,tail=myTail,a=a,b=b,d=d,e=e))
        })))
    })))
})))
}


ui <- fluidPage(

titlePanel("Carry Selector"),
sidebarPanel(
    selectInput(inputId = 'serverListInput',label = 'Server', choices=as.list(paste("adsg-",c("l01","ln01","l02","ln02"),sep="")),multiple = FALSE,selectize = TRUE),
    selectInput(inputId = 'currencyListInput',label = 'blabla', choices=list("blabla1","blabla2","blabla3"),multiple = TRUE,selectize = TRUE),
    fluidRow(
        column(6,selectInput(inputId = 'tenorListInput',label = 'Tenors', choices=as.list(c("All",paste(c(1,3,6),"m",sep=""),paste(c(seq(1,9),seq(10,30,5)),"y",sep=""))),multiple = TRUE,selectize = TRUE)),
        column(6,selectInput(inputId = 'tailListInput',label = 'Tails', choices=as.list(c("All",paste(c(1,2,3,5,7,10,15,20),"y",sep=""))),multiple = TRUE,selectize = TRUE))
    ),
    actionButton(inputId = 'launchCalcButton',label = 'Launch Calc')
),
mainPanel(
    fluidRow(
        column(12,dataTableOutput(outputId = 'table'))
    )
)
)

server <- function(input,output){
observeEvent(input$launchCalcButton, {  
    output$table <- renderDataTable({
        datatable(funSolver(input$serverListInput,input$currencyListInput,input$tenorListInput,input$tailListInput))
    })
})
}

app = shinyApp(ui,server)
runApp(app,port=3250,host='0.0.0.0')

您可以选择一些参数,然后单击按钮以显示funSolver功能生成的表格。我已将按钮调用包装到observeEvent中,因此只有在您单击时才会生成表格。我不明白为什么,如果你在第一次点击按钮后更改参数,即使我没有点击按钮,表也会更新。

Q1:预计会出现这种情况吗?

Q2:如果是,如何在闪亮的应用程序中执行我想要做的事情(仅当单击按钮时表格刷新,而不是在参数更新时刷新)?

所有帮助表示赞赏

1 个答案:

答案 0 :(得分:1)

您在observe事件部分中添加了render函数,这意味着每次依赖项在此事件中发生更改时它都会运行。查看?observeEvent为您提供了一个非常好的方法来获得您想要的东西:

编辑

我使用了selectinput和button选项,发现它实际上是由于multiple=TRUE参数(我相信)。出于某种原因,这个参数否决了observeEvent中的输入按钮依赖性。但是eventReactive下面的版本确实有效:

server <- function(input,output){
  df = eventReactive(input$launchCalcButton, {  
       data.table(funSolver(input$serverListInput,input$currencyListInput,input$tenorListInput,input$tailListInput))
  })

  output$table <- renderDataTable({
    df()
  })
}