【发布时间】:2019-05-05 02:55:18
【问题描述】:
我正在尝试创建一个闪亮的应用程序,该应用程序根据用户选择的已加载数据帧的子集生成绘图。例如,我有以下数据集:
library(shiny)
library(data.table)
df <- rbind(
data.table( cat = rep('X', 40), grp = rep(LETTERS[1:4], each=10), x = rep(1:10, times=4), y = rnorm(40) ),
data.table( cat = rep('Y', 30), grp = rep(LETTERS[1:3], each=10), x = rep(1:10, times=3), y = rnorm(30) ),
data.table( cat = rep('Z', 20), grp = rep(LETTERS[4:6], each=10), x = rep(1:10, times=2), y = rnorm(20) )
)
根据用户在 UI 中选择的cat 的值,我希望闪亮为grp 的每个值生成图表。因此,如果用户选择“X”,则将生成 4 个图;如果他们选择 'Y' 就会有 3 个,如果他们选择 'Z' 就会有 3 个。
我还想指定如何根据grp 的值生成每个图表。因此,如果 grp 是 A、D 或 E,我希望它生成一个线图,否则它应该生成一个散点图(当然,只有当 grp 具有该值时)。
以下是我的(损坏的)闪亮应用的代码:
server <- function(input, output) {
rv <- reactiveValues(
i = NULL,
df = NULL
)
observe({ rv$i <- input$i })
observe({ rv$df <- df[cat == rv$i] })
output$test <- renderUI({
plotList <- lapply( LETTERS[1:6], function(x) plotOutput(x) )
do.call( tagList, unlist(plotList, recursive=FALSE))
})
for(i in LETTERS[1:6]){
local({
my_i <- i
output[[my_i]] <- renderPlot({
if( my_i %in% c('A','D','E')) {
with(rv$df[grp == my_i], plot(x,y, type='l'))
} else {
with(rv$df[grp == my_i], plot(x,y))
}
})
})
}
}
ui <- fluidPage(
titlePanel('Title'),
sidebarLayout(
sidebarPanel(
helpText('Select the Category you would like to view.'),
selectInput('i', 'Category', c('X','Y','Z'), selectize=TRUE)
),
mainPanel(
uiOutput('test')
)
)
)
shinyApp(ui, server)
【问题讨论】:
-
这个答案对你有用吗?
标签: r shiny shiny-reactivity