我有以下非常简单的应用
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:如果是,如何在闪亮的应用程序中执行我想要做的事情(仅当单击按钮时表格刷新,而不是在参数更新时刷新)?
所有帮助表示赞赏
答案 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()
})
}