如何根据闪亮的复选框输入将多个 dySeries 发送到辅助轴?
How do I send multiple dySeries to a secondary axis based on checkbox input in shiny?
我正在尝试使用 lungDeaths 时间序列绘制 dyGraph,但我希望 "mdeaths" 和 "fdeaths" 位于次轴上,如果至少其中之一与 "ldeaths".
这是一个工作示例:
global.R
library(dygraphs)
library(shiny)
library(datasets)
library(stringr)
lungDeaths <- cbind(mdeaths, fdeaths)
ui.R
shinyUI(fluidPage(
titlePanel("Predicted Deaths from Lung Disease (UK)"),
sidebarLayout(
sidebarPanel(
id="sidebar", width = 3,
div(
checkboxGroupInput(
inputId = "selection", label = "Variables:",
choiceNames = list("ldeaths",
strong("mdeaths"),
strong("fdeaths")
),
choiceValues = c("ldeaths",
"mdeaths",
"fdeaths"), selected = "ldeaths"),
uiOutput("rendered"),
style = "font-size:75%"
)
),
mainPanel(
dygraphOutput("dygraph")
)
)
))
server.R
shinyServer(function(input, output) {
lungDeaths <- cbind(mdeaths, fdeaths, ldeaths)
rData <- reactive({
rData <- ts(lungDeaths[,input$selection])
})
output$dygraph <- renderDygraph({
if(length(input$selection) > 1 & length(str_subset(input$selection, 'ldeaths$'))>0){
if(length(str_subset(input$selection, 'fdeaths$'))>0 & length(str_subset(input$selection, 'mdeaths$'))>0){
dygraph(rData(), main = "Deaths from Lung Disease (UK)") %>%
dySeries("mdeaths", axis = 'y2') %>%
dySeries("fdeaths", axis = 'y2')
}
else if(length(str_subset(input$selection, 'mdeaths$'))>0){
dygraph(rData(), main = "Deaths from Lung Disease (UK)") %>%
dySeries("mdeaths", axis = 'y2')
}
else if(length(str_subset(input$selection, 'fdeaths$'))>0){
dygraph(rData(), main = "Deaths from Lung Disease (UK)") %>%
dySeries("fdeaths", axis = 'y2')
}
}
else
dygraph(rData(), main = "Deaths from Lung Disease (UK)")
})
})
这段代码完成了我想要它做的事情,但我想避免使用太多 if 和 else,因为我实际使用的项目有 6 个项目在被选中时应该转到 y2。有什么方法可以做到这一点而不必指定每种可能性吗?
我已经研究过 how to add dySeries based on input and how to do ,但到目前为止我找到的答案对我不起作用。我通常会收到一条错误消息:
$ operator is invalid for atomic vectors
我做到了,所以我发布了答案,以帮助那些一直在为同样的问题而苦苦挣扎的人...
我在尝试进行条件管道评估时没有正确使用 if else,这就是为什么我一直收到问题中提到的错误的原因。
事实证明,我必须使用点 (.) 来准确指定应该在以下函数中插入管道之前的对象的位置,这可能是因为该函数在条件评估中。下面的代码完全符合我的要求:
output$dygraph <- renderDygraph({
dygraph(rData(), main = "Deaths from Lung Disease (UK)") %>%
{
if(length(str_subset(input$selection, 'mdeaths$')) > 0 )
dySeries(.,"mdeaths", axis = 'y2')
else
.
} %>%
{
if(length(str_subset(input$selection, 'fdeaths$')) > 0 )
dySeries(.,"fdeaths", axis = 'y2')
else
.
}
})
dygraph 现在在次轴上显示 dyseries,只要它们被选为输入
你应该这样做:
dg = dygraphs(rData, main="...") %>%
dyAxis("y", label="...") %>%
dyAxis("y2", label="...")
for(col in leftCols)
dg = dg %>% dySeries(col, axis="y")
for(col in rightCols)
dg = dg %>% dySeries(col, axis="y2")
我正在尝试使用 lungDeaths 时间序列绘制 dyGraph,但我希望 "mdeaths" 和 "fdeaths" 位于次轴上,如果至少其中之一与 "ldeaths".
这是一个工作示例:
global.R
library(dygraphs)
library(shiny)
library(datasets)
library(stringr)
lungDeaths <- cbind(mdeaths, fdeaths)
ui.R
shinyUI(fluidPage(
titlePanel("Predicted Deaths from Lung Disease (UK)"),
sidebarLayout(
sidebarPanel(
id="sidebar", width = 3,
div(
checkboxGroupInput(
inputId = "selection", label = "Variables:",
choiceNames = list("ldeaths",
strong("mdeaths"),
strong("fdeaths")
),
choiceValues = c("ldeaths",
"mdeaths",
"fdeaths"), selected = "ldeaths"),
uiOutput("rendered"),
style = "font-size:75%"
)
),
mainPanel(
dygraphOutput("dygraph")
)
)
))
server.R
shinyServer(function(input, output) {
lungDeaths <- cbind(mdeaths, fdeaths, ldeaths)
rData <- reactive({
rData <- ts(lungDeaths[,input$selection])
})
output$dygraph <- renderDygraph({
if(length(input$selection) > 1 & length(str_subset(input$selection, 'ldeaths$'))>0){
if(length(str_subset(input$selection, 'fdeaths$'))>0 & length(str_subset(input$selection, 'mdeaths$'))>0){
dygraph(rData(), main = "Deaths from Lung Disease (UK)") %>%
dySeries("mdeaths", axis = 'y2') %>%
dySeries("fdeaths", axis = 'y2')
}
else if(length(str_subset(input$selection, 'mdeaths$'))>0){
dygraph(rData(), main = "Deaths from Lung Disease (UK)") %>%
dySeries("mdeaths", axis = 'y2')
}
else if(length(str_subset(input$selection, 'fdeaths$'))>0){
dygraph(rData(), main = "Deaths from Lung Disease (UK)") %>%
dySeries("fdeaths", axis = 'y2')
}
}
else
dygraph(rData(), main = "Deaths from Lung Disease (UK)")
})
})
这段代码完成了我想要它做的事情,但我想避免使用太多 if 和 else,因为我实际使用的项目有 6 个项目在被选中时应该转到 y2。有什么方法可以做到这一点而不必指定每种可能性吗?
我已经研究过 how to add dySeries based on input and how to do
$ operator is invalid for atomic vectors
我做到了,所以我发布了答案,以帮助那些一直在为同样的问题而苦苦挣扎的人...
我在尝试进行条件管道评估时没有正确使用 if else,这就是为什么我一直收到问题中提到的错误的原因。
事实证明,我必须使用点 (.) 来准确指定应该在以下函数中插入管道之前的对象的位置,这可能是因为该函数在条件评估中。下面的代码完全符合我的要求:
output$dygraph <- renderDygraph({
dygraph(rData(), main = "Deaths from Lung Disease (UK)") %>%
{
if(length(str_subset(input$selection, 'mdeaths$')) > 0 )
dySeries(.,"mdeaths", axis = 'y2')
else
.
} %>%
{
if(length(str_subset(input$selection, 'fdeaths$')) > 0 )
dySeries(.,"fdeaths", axis = 'y2')
else
.
}
})
dygraph 现在在次轴上显示 dyseries,只要它们被选为输入
你应该这样做:
dg = dygraphs(rData, main="...") %>%
dyAxis("y", label="...") %>%
dyAxis("y2", label="...")
for(col in leftCols)
dg = dg %>% dySeries(col, axis="y")
for(col in rightCols)
dg = dg %>% dySeries(col, axis="y2")