我正在处理我的闪亮应用程序,我要做的一件事就是调用一个函数(返回一个对象列表),然后在不同的多个调用中使用它的结果。不用说,我不想多次调用该函数,每次我需要从列表中引用其中一个对象。我如何以最有效的方式实现这一目标?
示例,函数类似于 -
function_to_get_list <- function(){
# first, input data is read at some point then this function is called
if(!is.null(input_data)){
... some processing and calls to create the list of objects
return(list_of_object)
}
else
return(NULL)
}
现在,我想调用此函数一次并将结果保存在变量中,这是我需要知道如何正确执行此操作的地方。
list_of_objects <- function_to_get_list()
然后只使用该变量来引用该列表的元素。
output$text1 <- renderText({
list_of_objects[[1]]
})
output$text2 <- renderText({
list_of_objects[[2]]
})
# use of renderText is just to illustrate the calls to use the list
我希望我很清楚我想用上面的例子来实现,如果没有,请告诉我。
提前致谢!
AK
答案 0 :(得分:4)
您可以使用reactiveValues()
执行此操作。 Reference
values <- reactiveValues()
function_to_get_list <- function(){
# first, input data is read at some point then this function is called
if(!is.null(input_data)){
... some processing and calls to create the list of objects
values[[1]] <- list_of_objects
}
else
return(NULL)
}
output$text1 <- renderText({
values[[1]][[1]]
})
output$text2 <- renderText({
values[[1]][[2]]
})
答案 1 :(得分:1)
在修复一些索引以引用列表元素之后,我能够使它工作。
library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
actionButton("action", "RUN")
),
mainPanel(
textOutput("text1"),
textOutput("text2")
)
)
)
server <- function(input, output) {
values <- reactiveValues()
function_to_get_list <- function(){
return(list(c(1:5)))
}
values[['1']] <- function_to_get_list()
output$text1 <- renderText({
if(input$action > 0)
paste("1st element of list ", values[['1']][[1]][[1]])
})
output$text2 <- renderText({
if(input$action > 0)
paste("2nd element of list ", values[['1']][[1]][[2]])
})
}
shinyApp(ui = ui, server = server)