使用Rhsonsontable和ReactValues时可以更快地发光

时间:2018-10-13 05:28:25

标签: r shiny reactive-programming rhandsontable

我的闪亮代码具有用户可以编辑的rhandstontable。这将导致基于自定义功能更新最右边的列。该代码还会在两个ggplots上绘制表中的值,并且在表值更改时也会更新。所有这些都有效,除了有趣的两次刷新使Shiny变慢;我的表不是很大,约有30行乘以23列,其中图中只使用了4列,但是自定义函数中只有约12列。

是否有一种方法可以使用observe(),reactorValues或其他相关函数来提高光泽度?

我是反应式表达式的新手,并且我一直在阅读,通过适当地缓存数据可以使应用程序更快。

library(shiny)
library(rhandsontable)
library(tidyverse)
library(ggthemes)
library(ggrepel)

## Create the dataset
DF <- readRDS("data/DF2.Rds")
numberofrows <- nrow(DF)
# weighting variables
w1 = (c(4,3,1))
w2 = (c(1,1,1,1))
w3 = (c(2,2,1,2,1,1,2))
# Function to calculate scores
ScoresTbl <- function(data, w1, w2, w3){
  Description <- data[,1:9]
  Potential <- crossprod(t(data[,10:12]), w1)/sum(w1)
  Setting <- crossprod(t(data[,13:16]), w2)/sum(w2)
  Risk <- crossprod(t(data[,17:23]),w3)/sum(w3)
  data.frame(data[1:23],Potential,Setting,Risk) %>%
    mutate(
      SOP = rowMeans(data.frame(Potential,Setting,Risk)))
}

ui = fluidPage(
  fluidRow(column(12,
                  rHandsontableOutput('hotable1', width = "100%", height = "25%")#,
                  # actionButton("go", "Plot Update")
  )),
  fluidRow(column(6, plotOutput("plot1")),
           column(6, plotOutput("plot2")))
)
server <- shinyServer(function(input, output) {

  indat <- reactiveValues(data=ScoresTbl(DF,w1, w2, w3))

  observe({
    if(!is.null(input$hotable1))
      indat$data <- hot_to_r(input$hotable1)
  })


  output$hotable1 <- renderRHandsontable({
    rhandsontable(ScoresTbl(indat$data,w1, w2, w3))
  })

  output$plot1 <- renderPlot({
    ggplot(data = indat$data,
           aes(x=Potential,
               y=Setting, label = Project)) +
      geom_point(alpha = 0.5) +
      scale_size(range = c(2,15)) +
      geom_text_repel(colour = "black",size = 2.5) +
      theme_minimal()
  })
  output$plot2 <- renderPlot({
    ggplot(data = indat$data,
           aes(x=Potential,
               y=Setting, label = Project)) +
      geom_point(alpha = 0.5) +
      scale_size(range = c(2,15)) +
      geom_text_repel(colour = "black",size = 2.5) +
      theme_minimal()
  })
})

shinyApp(ui, server)

0 个答案:

没有答案