[英]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$codeInput
和input$varInput
是NULL
應用程序啟動時,所以你必須使用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.