首页 > 解决方案 > 如何从另一个输出访问变量

问题描述

我目前正在尝试构建我的第一个 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)
})

标签: rshiny

解决方案


如果您还没有,请查看可用shiny的教程。

您可以在其他地方声明这些变量,而不是将您的数据包含在单个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) }) 
}

推荐阅读