我希望有人能帮助我解决这个看似简单的问题。我正在尝试制作一个闪亮的演示文稿,演示闪亮的应用程序如何工作,而无需在浏览器中打开它。我的问题很简单,当我更改
selectInput()
下拉列表时,我无法更新输出数据表。
第 1 步是生成数据框列表,第 2 步是汇总数据(平均值、标准偏差等),第 3 步是获取要在
datatable
中显示的数据。下面的代码仅显示其中一种“药物”的输出。
我觉得我错过了一些简单的东西......非常感谢帮助!
可重现的示例在这里:
# YAML
---
title: "Mytitle"
author: "Me"
date: "05/10/2023"
output:
ioslides_presentation:
smaller: false
runtime: shiny
---
library(tidyverse)
library(DT)
library(shiny)
#Make some fake data
eg.drugs <- list(Bunnies = data.frame(SampleID = LETTERS[1:20],
SampleType = c(rep("QC1", 5), rep("QC2", 5), rep("Patient", 10)),
Cal1 = c(round(rnorm(5, 35, 5),2), round(rnorm(5, 75, 10),2), jitter(seq(from=1, to=100, by=10))),
Cal2 = c(round(rnorm(5, 32, 4.5),2), round(rnorm(5, 80, 11)), jitter(seq(from=1, to=100, by=10)))),
Kittens = data.frame(SampleID = LETTERS[1:20],
SampleType = c(rep("QC1", 5), rep("QC2", 5), rep("Patient", 10)),
Cal1 = c(round(rnorm(5, 34, 5),2), round(rnorm(5, 70, 10),2), jitter(seq(from=1, to=100, by = 10))),
Cal2 = c(round(rnorm(5, 38, 4.5),2), round(rnorm(5, 80, 11),2), jitter(seq(from=1, to=100, by = 10)))),
Unicorns = data.frame(SampleID = LETTERS[1:20],
SampleType = c(rep("QC1", 5), rep("QC2", 5), rep("Patient", 10)),
Cal1 = c(round(rnorm(5, 7.5, 1),2), round(rnorm(5, 55, 3),2), jitter(seq(from=1, to=100, by = 10))),
Cal2 = c(round(rnorm(5, 9, 2),2), round(rnorm(5, 51, 4.5),2), jitter(seq(from=1, to=100, by = 10)))))
fluidPage(
fluidRow(sidebarPanel(
selectInput('drug', "Choose Drug:", choices = names(eg.drugs)), width = 12),
width = 6),
fluidRow(mainPanel({
DTOutput('table')
}, width = 12), width = 6)
)
output.dat <- reactive({
sum.dat <- lapply(eg.drugs, function(x){
x %>%
gather(SpecID, Value, 3:4) %>%
filter(SampleType != "Patient") %>%
group_by(SampleType, SpecID) %>%
summarise(Mean = round(mean(Value),2),
SD = round(sd(Value),3)) %>%
pivot_wider(id_cols = SampleType, names_from = SpecID, values_from = c("Mean", "SD"))
})
return(sum.dat)
})
renderDT({
datatable(output.dat()[[input$drug]])
}
)
我已经使用 R 和 Shiny 一段时间了,但这是我第一次尝试 Shiny 演示。非常感谢帮助!
您必须将输出
renderDT
分配给用户界面中的输出“组件”。在您的 mainPanel
中是组件 DTOutput('table')
。
要在那里显示输出,您必须通过以下方式将其分配给此组件:
output$table <- renderDT({
datatable(output.dat()[[input$drug]])
}