我有一个功能强大的Shiny程序,但速度极慢且繁琐,因为我在每个输出块中重复调用计算密集型函数。
虽然这有效,但运行起来需要几分钟,因为我强迫计算机每次需要时重复计算相同的信息。
如何进行单个函数调用,将结果数据拉入单个列表,然后将其分发到需要不同部分的各种Shiny输出块?
这是有效的服务器端代码......(我认为ui方面没问题......)
library(shiny)
shinyServer(
function(input, output) {
output$table7 <- renderTable({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
WorkingSet <- read.csv(inFile$datapath, header=TRUE, sep=',',
quote='"')
TempHolder <- CARTOptimizer(WorkingSet, input$seed, input$k, input$whichcluster)
TempHolder$v2
})
output$plot1 <- renderPlot({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
WorkingSet <- read.csv(inFile$datapath, header=TRUE, sep=',',
quote='"')
TempHolder <- CARTOptimizer(WorkingSet, input$seed, input$k, input$whichcluster)
clustertree = rpart(badcluster ~ ., data=TempHolder$v3, method="class",
control=rpart.control(cp=TempHolder$v1))
prp(clustertree)
})
output$table1 <- renderTable({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
WorkingSet <- read.csv(inFile$datapath, header=TRUE, sep=',',
quote='"')
SingleClusterHolder <- SingleCluster(WorkingSet, input$seed, input$k,
input$whichcluster)
SingleClusterHolder$v1
})
})
闪亮输出的屏幕截图:
请注意,CARTOptimizer和SingleCluster是用户定义的函数,每个函数返回三个不同的值:
如您所见,其中一些是单值,一些是矩阵,一些是数据帧。
非常欢迎有关如何提高效率的建议。
谢谢。
答案 0 :(得分:0)
在我看来,你有3个需要更新的实体:table7,table1和plot1。我认为你能做到的最好的想法就是从分配这些代码的函数中删除尽可能多的代码。例如,看起来您加载相同的csv文件3次,每次输出一次。您应该有一个单独的反应性代码块来读取文件并从该文件中组装所需的任何信息而不生成任何图形。为防止它导致其他函数执行,请在每个输出中使用return(NULL)
条件,以防止在未设置其他参数的情况下显示。如果来自同一函数的结果用于多个输出,则将该函数作为单独的反应对象。然后,只要在UI中更改参数,该函数就会执行一次。结果发生变化的事实会触发相关的输出发生变化。
通常,如果要将相同的计算密集型代码多次放入server.R
文件中,则会创建一个较慢的程序。找到一种方法让更新像多米诺骨牌一样发生,这样每个要响应输入变化而更新的变量都保存在自己的被动对象中并存储在变量中。然后仅在输出定义中的必要时使用这些变量。