我正在尝试在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()
,它是一个字符串。但是,在运行时,主面板上不会返回任何内容。