Как получить доступ к элементам, хранящимся в списке на сервере (Shiny) - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу вызвать функцию fziim (определенную ранее), аргументы которой зависят от значений двух виджетов, определенных в пользовательском интерфейсе. Функция возвращает список с несколькими графиками, которые я хочу отобразить.

Я пробую следующий код, но не могу заставить его работать должным образом, так как элементы списка кажутся недоступными

Первый пользовательский интерфейс

ui <- fluidPage(
sidebarLayout(
sidebarPanel(

  fluidRow(

    column(9,
           selectInput("sector", h4("Sector"), 
                       choices = list("S1","S1")
                       , selected = 1))# need to insrt instead list with sector names
  ),

  fluidRow(

    column(9, 
           numericInput("num1", 
                        h4("Investment value (million $)"), 
                        value = "100"))  
  )
),
mainPanel(
  tabsetPanel(

    tabPanel("Trade Balance",

             fluidRow(
               plotOutput("graph_trade")
             )

    ),
    tabPanel("Imports",

             fluidRow(
               plotOutput("graph_imports")
             )

    ),
    tabPanel("Exports",

             fluidRow(
               plotOutput("graph_exports")
             )

    ),
    tabPanel("Supply chain",

             fluidRow(
               plotOutput("graph_supply_chain")
             )

    ),
    tabPanel("Taxes",


             fluidRow(
               plotOutput("graph_all_taxes")

             )
    ),

    tabPanel("Employment",

             fluidRow(
               plotOutput("graph_employment"),

             )

    )



  )
)
  )
)

А сервер выглядит следующим образом:

server <- function(input, output) {

  impacts_update<-fziim(sector =input$sector,investment =input$num1 )



  output$graph_all_taxes<-renderPlot({
    impacts_update$graph_all_taxes

  })
  output$graph_employment<-renderPlot({
    impacts_update$graph_employment
  })
  output$graph_trade<-renderPlot({
    impacts_update$graph_trade_balance
  })
  output$graph_imports<-renderPlot({
    impacts_update$graph_imports_blockade
  })
  output$graph_exports<-renderPlot({
    impacts_update$graph_exports_blockade
  })
  output$graph_supply_chain<-renderPlot({
    impacts_update$graph_domestic
  })


}

Где выглядит fziim:

fziim<-function(sector, investment){
  g1<-plot1
  g2<-plot2
  g3<-plot3
  g4<-plot4
  g5<-plot5
  g6<-plot6

  output<-list(g1,g2,g3,g4,g5,g6)
  return(output)
}

1 Ответ

0 голосов
/ 07 ноября 2018

Вот воспроизводимое приложение, которое охватывает основные моменты того, что вы ищете. Мы делаем impacts_update реактивную функцию и вызывайте ее в каждой renderPlot функции. Это позволяет нам присвоить его обычной переменной и извлечь из списка данных.

library(shiny)

ui <- fluidPage(


  sidebarLayout(
    sidebarPanel(
    selectInput("A","Test",choices=c(1,2,3)),
    selectInput("B","TEest",choices=c(1,2,3))
    ),


    mainPanel(
      plotOutput("graph_all_taxes"),
      plotOutput("graph_employment")
    )

    ))

      server <- function(input, output) {

        fziim<-function(A,B){
          C<-(1:3)
          A<-as.numeric(A)
          dfA<-data.frame(A,C)
          g1<-dfA
          B<-as.numeric(B)
          dfB<-data.frame(B,C)
          g2<-dfB
          return(list(g1,g2))
        }


        impacts_update<-reactive({
          fziim(input$A, input$B)
        })

        output$graph_all_taxes<-renderPlot({
          graph_tax<-impacts_update()
          graph_tax<-unlist(graph_tax)
          plot(graph_tax[1])
        })
        output$graph_employment<-renderPlot({
          graph_tax2<-impacts_update()
          graph_tax2<-unlist(graph_tax2)
          plot(graph_tax2[2])
        })

        #And so on...


}

shinyApp(ui = ui, server = server)

Примечание: моя функция fiizm предназначена только для тестирования.

Основное изменение

Как мы создаем список

impacts_update<-reactive({
fziim(sector =input$sector,investment =input$num1)
)}

Как мы называем список

output$graph_all_taxes<-renderPlot({
          graph_tax<-impacts_update()
          graph_tax<-unlist(graph_tax)
          plot(graph_tax[1])
        })
...