如何从另一个输出访问变量

时间:2019-12-13 16:15:41

标签: r shiny

我现在正在尝试构建我的第一个Shiny应用程序,并且遇到了一些问题。是否可以从其他输出对象访问变量?我正在尝试在第一个标签中打印表格,并在单独的标签上显示各个图,如果我可以在一个标签上显示所有3个标签,那就更好了。

mainPanel(
tabsetPanel(type = "tabs",
tabPanel("Table", tableOutput("dataTable")),
tabPanel("xy Chart", plotOutput("xyChart")),
tabPanel("yz Chart", plotOutput("yzChart"))
                    )
    )
)
)
)
server <- function(input, output) {

output$dataTable <- renderTable({
    x <- rnorm(100, mean = 1)
    y <- rnorm(100, mean = 0)
    z <- rnorm(100, mean = 0.5)
    dataTable <- cbind(x,y,z)
})
output$xyChart <- renderPlot({
    plot(x,y)
})

1 个答案:

答案 0 :(得分:1)

如果还没有,请看shiny教程available

您可以在其他地方声明这些变量,而不是将数据包含在output内的单个server中。由于您正在创建shiny应用程序,因此您可能会对更改这些变量以及让其他outputs自动更新感兴趣。

如果是这样,您可能要使用reactiveValues或创建一个reactive函数。

下面是一个示例。通过使用reactiveValues,当您从其中读取一个值(例如x,y或z)时,调用表达式对该值具有反应性依赖性(并将对其进行更改以进行更新)。每当您修改这些值时,它将通知所有依赖于该值的反应式功能。

library(shiny)

ui <- fluidPage(
  mainPanel(
    tabsetPanel(type = "tabs",
      tabPanel("Plot", plotOutput("plot")),
      tabPanel("Summary", verbatimTextOutput("summary")),
      tabPanel("Table", tableOutput("table"))
    )
  )
)

server <- function(input, output) {

  my_data <- reactiveValues(
    x = rnorm(100, mean = 1),
    y = rnorm(100, mean = 0),
    z = rnorm(100, mean = 0.5)
  )

  output$table <- renderTable({
    data.frame(my_data$x, my_data$y, my_data$z)
  })

  output$plot <- renderPlot({
    plot(my_data$x, my_data$y)
  })

  output$summary <- renderText({
    "Summary Goes Here"
  })
}

shinyApp(ui = ui, server = server)

如果要在一个面板上全部使用3个(如注释所述),请将其用于ui

ui <- fluidPage(
  mainPanel(
    tabsetPanel(type = "tabs",
                tabPanel("All 3", 
                         plotOutput("plot"),
                         verbatimTextOutput("summary"),
                         tableOutput("table")
                         )
    )
  )
)

如果要包括input$nRV(如注释中所述),请使用reactive表达式,并将其称为my_data()

server <- function(input, output) { 
  my_data <- reactive({ 
    a = rnorm(input$nRV, mean = 2) 
    b = rnorm(input$nRV, mean = 5) 
    x = rnorm(input$nRV, mean = 3) 
    y = rnorm(input$nRV, mean = 0) 
    z = rnorm(input$nRV, mean = 0.5)
    data.frame(a, b, x, y, z)
  }) 

  output$table <- renderTable({ data.frame(my_data()$x, my_data()$y, my_data()$z) 
  }) 

  output$plot <- renderPlot({ plot(my_data()$x, my_data()$y) }) 
}