我有10年的四个变量数据。这是数据的样子
dat <- data.frame(year = rep(2001:2010, each = 50),
a = rnorm(50), b = rnorm(50), c = rnorm(50), d = rnorm(50))
dat_l <- tidyr::gather(dat, variable, value, a:d)
我正在尝试学习闪亮的应用程序。我希望我的应用在给定年份内将一个变量与另一个变量作图
例如如果用户选择a
和b
以及2001年,则将a
对b
绘制2001年。
如果为2003年选择了b
和c
,请绘制2003年的b
与c
,依此类推。
如果在给定年份中选择了一个变量或两个以上变量,也不要执行任何操作。
library(shiny)
u <- fluidPage(
titlePanel('My analytics'),
sidebarLayout(position = 'left',
sidebarPanel(
checkboxInput('a', 'aRef', value = F),
checkboxInput('b', 'bRef', value = F),
checkboxInput('c', 'cRef', value = F),
checkboxInput('d', 'dRef', value = F),
sliderInput('yearRef','Select Year',min=2001,max=2010,value=1)
),
mainPanel(
tabsetPanel(
tabPanel('Scatter', plotOutput(outputId = 'scatter'))
)
)
)
)
s <- shinyServer(function(input, output)
{
pt1 <- reactive({
if (!input$a) return(NULL)
pdata <- dplyr::filter(dat_l, variable == input$a and year == input$yearRef)
plot(pdata$value, pdata$value)
})
output$scatter = renderPlot({pt1})
})
shinyApp(u,s)
此代码不完整,希望我能在如何开发代码的服务器部分方面有所帮助。
答案 0 :(得分:0)
我将服务器代码更新为您想要的样子。
pt1
应该要求您需要过滤数据以防止出现警告。
input$a
不会返回“ a”,而是返回TRUE
-因此,要对a进行过滤,您可以在复选框中选择a,b,c和d以及基于子集的方式包括矢量输入(见下文)。它还检查以确保仅选中2个复选框(总和为2)。根据您的需求,可以全部简化。您可能要包括checkboxGroupInput
来代替,它将返回选择的字符向量。
由于您可以将一个到d的多个复选框组合在一起,因此请使用%in%
而不是==
。
output$scatter
将通过调用反应函数pt1
获得过滤后的数据。它将确定在子集数据中存在哪些2个变量,并绘制1与另一个变量。
希望这会有所帮助。
s <- function(input, output) {
pt1 <- reactive({
req(input$yearRef)
if (sum(input$a, input$b, input$c, input$d) == 2) {
dplyr::filter(dat_l, variable %in% c("a"[input$a], "b"[input$b], "c"[input$c], "d"[input$d]) &
year == input$yearRef)
} else {
return(NULL)
}
})
output$scatter = renderPlot({
pdata <- pt1()
pvars <- unique(pdata$variable)
if (!is.null(pdata)) {
plot(pdata[pdata$variable == pvars[1], ]$value,
pdata[pdata$variable == pvars[2], ]$value,
xlab = pvars[1], ylab = pvars[2])
}
})
}