我有一个功能强大的程序,但是非常慢和麻烦,因为我在每个输出块中反复调用计算密集型函数。
虽然这样做有效,但它需要几分钟才能运行,因为每次需要时,我都会强迫计算机重复计算相同的信息。
我如何进行单个函数调用,将结果数据拉到一个列表中,然后将其分发到需要其不同部分的各种闪亮输出块中?
这是服务器端的代码.(我认为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是用户定义的函数,分别返回三个不同的值:
如您所见,其中一些是单个值,一些是矩阵,还有一些是数据帧。
关于如何提高这一效率的建议将受到极大欢迎。
谢谢。
发布于 2015-03-09 19:43:52
在我看来,您有三个需要更新的实体: table7、table1和plot1。我认为您在这里所能做的最好的就是从分配这些代码的函数中删除尽可能多的代码。例如,看起来您加载了相同的csv文件3次,每次输出一次。您应该有一个单独的代码块,用于读取文件,并从该文件中汇编所需的任何信息,而无需生成任何图形。要防止它导致其他函数执行,请在每个输出中使用一个return(NULL)条件,如果没有设置其他参数,则该条件禁止显示。如果同一函数的结果在多个输出中使用,则该函数必须是一个单独的反应性对象。然后,每当在UI中更改参数时,该函数只执行一次。其结果发生了变化,这一事实触发了相关的输出发生变化。
通常,如果您多次将相同的计算密集型代码放入您的server.R文件中,则您正在创建一个较慢的程序。找到一种让更新像多米诺骨牌一样发生的方法,以便响应输入变化而更新的每个变量都保存在自己的反应性对象中,并存储在变量中。然后,只在必要时在您的输出定义中使用这些变量。
https://stackoverflow.com/questions/24807874
复制相似问题