Как отправить несколько dySeries на дополнительную ось на основе ввода флажка в блестящем?

Я пытаюсь построить dyGraph, используя временные ряды lungDeaths, но я хочу, чтобы «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")
    )
)
))

сервер.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 при выборе. Есть ли способ сделать это без указания каждой возможности?

Я уже изучил как добавить dySeries на основе ввода и как это сделать условная оценка при использовании каналов, но ответы, которые я нашел до сих пор, не работают для меня. Обычно я получаю сообщение об ошибке:

Оператор $ недействителен для атомарных векторов


person Pedro Costa    schedule 05.11.2019    source источник


Ответы (2)


Вы должны сделать что-то вроде:

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")
person lambruscoAcido    schedule 18.02.2020

Я сделал это, поэтому я отправляю ответ, чтобы помочь всем, кто боролся с той же проблемой...

Я неправильно использовал 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
                    .
            }

})

Диграф теперь показывает диссерии на вторичной оси всякий раз, когда они выбраны в качестве входных данных.

person Pedro Costa    schedule 11.12.2019