多个反应对象以闪亮+ DT中的renderDT()

时间:2020-07-31 14:48:10

标签: r shiny reactive dt

我正在尝试在renderDT()函数中输入多个反应对象。但是,我将函数使用的内容存储在两个不同的反应对象中,例如:

UI代码:

library(shiny)
library(DT)

ui <- fluidPage(
  # App title ----
  titlePanel("test"),
  sidebarLayout(
    
    # Sidebar panel for inputs ----
    sidebarPanel(width = 2,
                 uiOutput("codePanel"), 
                 uiOutput("varPanel") 
    ),
    
    mainPanel(
      
      DT::dataTableOutput("text")
      
    )
  )
)

服务器代码:

server <- function(input, output) {
  
  df <- read.csv('fundos.csv')
  df$tipo_fundo <- as.character(df$tipo_fundo)
  Encoding(df$tipo_fundo) <- "UTF-8"
  row.names(df) <- paste0(df$X, " (",df$cotacao, ")")
  
  filt <- selectInput("codeInput",label ="var1",
                      choices = (unique(df$tipo_fundo)), multiple = T, selected = "Shoppings")
  
  filt2 <- selectInput("varInput",label ="var2",
                       choices = colnames(df[,-c(1,2,8,9)]), multiple = T, selected = colnames(df[,-c(1,2,8,9)]))
  
  output$codePanel <- renderUI({ filt
    
  })
  
  output$varPanel <- renderUI({ filt2
    
  })
  
  dat <- reactive({
  req(input$codeInput, input$varInput)
  
  ab <- subset(df, tipo_fundo %in% input$codeInput) 
  ab <- ab[,-c(1,2,8,9)]
  ab <- ab[, names(ab) %in% input$varInput] 
  ab
})
  
  dat2 <- reactive({
  
  vals <- list()
  
  for(g in 1:ncol(dat())) vals$rm[g] = mean((dat()[,g]))
  for(g in 1:ncol(dat())) vals$rr[g] = range(dat()[,g])[2]-range(dat()[,g])[1]
  for(g in 1:ncol(dat())) vals$r1[g] = abs(range(dat()[,g]))[2] - mean((dat()[,g]))
  for(g in 1:ncol(dat())) vals$r0[g] = abs(range(dat()[,g]))[1] - mean((dat()[,g]))
  
  string <- paste0("function(row, data) {",
         paste(lapply(1:ncol(dat()),function(i){
           paste0("var value=Math.abs(dat()a[",i,"]);
                                        var value2=dat()a[",i,"];
                                       if (value!==null){
                                       if(value2 < ",vals$rm[i],"){
                                       $(this.api().cell(row,",i,").node()).css({'background':isNaN(parseFloat(value)) || value > ",vals$rr[i]," ? '' : 'linear-gradient(90deg, transparent ' + (1 - (",vals$rm[i]," - value2)/",vals$rr[i],")* 100 + '%, red ' + (1 - (",vals$rm[i]," - value2)/",vals$rr[i],") * 100 + '%)','background-size':'98% 88%','background-repeat':'no-repeat','background-position':'center'});
                                       }else{
                                       $(this.api().cell(row,",i,").node()).css({'background':isNaN(parseFloat(value)) || value > ",vals$rr[i]," ? '' : 'linear-gradient(90deg, transparent ' +  (1 - (-",vals$rm[i]," + value2)/",vals$rr[i],") * 100 + '%, lightgreen ' +   (1 - (-",vals$rm[i]," + value2)/",vals$rr[i],")* 100 + '%)','background-size':'98% 88%','background-repeat':'no-repeat','background-position':'center'});
                                       }
                                       } ") 
         }),collapse="\n"),
         "} ")
  
  return(string)
  })
  
  
  output$text <- renderDT(dat(),  
    options = list(
      rowCallback=JS(isolate(dat2()))
    )) 
}

我有一个反应性函数dat(),它是我的数据以反应性方式返回。另外,我还有另一个反应性对象dat2(),它是一个字符串。但是,在运行时,主面板上不会返回任何内容。

0 个答案:

没有答案