簡體   English   中英

對 shiny + DT 中的 data.frame 反應

[英]reactive to data.frame in shiny + DT

我正在努力處理反應性 object。 我創建了一個反應式 function 來更改 data.frame,但是,我想在反應式 function 之后計算一些措施。

到目前為止我的工作:

用戶界面代碼:

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

服務器代碼:

server <- function(input, output) {
  
  df <- as.data.frame(cbind(matrix(round(runif(50, -1, 1), 3), 10), sample(0:1, 10, TRUE)))
  
  filt <- selectInput("codeInput",label ="filter1",
                      choices = as.list(unique(df$V6)), multiple = T, selected = 0)
  
  filt2 <- selectInput("varInput",label ="filter2",
                       choices = colnames(df[,-6]), multiple = T, selected = colnames(df[,-6]))
  
  output$codePanel <- renderUI({ filt
    
  })
  
  output$varPanel <- renderUI({ filt2
    
  })
  
  dat <- reactive({
    
    ab <- subset(df, V6 %in% input$codeInput) 
    ab <- ab[,-6]
    ab <- ab[, names(ab) %in% input$varInput] 
    
    
  })
  
 
  
  df1 <- as.data.frame(isolate(dat()))
  
  vals <- reactiveValues()
  vals$rm = mean(rowMeans(df1))
  vals$rr = range(df1)[2]-range(df1)[1]
  vals$r1 = abs(range(df1))[2] - mean(rowMeans(df1))
  vals$r0 = abs(range(df1))[1] - mean(rowMeans(df1))
  
}

我的問題是試圖isolate(dat()並將其轉換為data.frame:

  df1 <- as.data.frame(isolate(dat()))

錯誤消息顯示“'closure' 類型的對象不是子集”。

我不知道這個錯誤的原因(當我運行你的代碼時我得到一個不同的錯誤)但是你的服務器代碼有幾個問題。

input$codeInputinput$varInputNULL應用程序啟動時,所以你必須使用req

  dat <- reactive({
    req(input$codeInput, input$varInput)
    ab <- subset(df, V6 %in% input$codeInput) 
    ab <- ab[,-6]
    ab <- ab[, names(ab) %in% input$varInput] 
  })

你不能在沒有反應上下文的情況下調用dat() ,就像你在編寫df1 <- as.data.frame(dat())時所做的那樣。 您可以按如下方式定義您的反應值vals

  vals <- reactiveValues()
  
  observe({
    vals$rm = mean(rowMeans(dat()))
    vals$rr = range(dat())[2]-range(dat())[1]
    vals$r1 = abs(range(dat()))[2] - mean(rowMeans(dat()))
    vals$r0 = abs(range(dat()))[1] - mean(rowMeans(dat()))
  })

請注意,我使用observe ,因為它是一個反應性上下文,這是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM