【问题标题】:RShiny: Refer to data from UI in serverR Shiny:在服务器中引用来自 UI 的数据
【发布时间】:2020-08-10 23:19:33
【问题描述】:

示例案例:我的 global.R 中有一个名为 get_data 的函数,它返回许多项目的列表。我不只是将数据放在全局中的原因是数据可以在一定时间后自动刷新

ui.R

my_data <- uiOutput("data") # Doesn't work
### Some more generic manipulation before final use

# The output of my_data will look like the following below.
my_data <- list()
my_data$first_entry <- c("a", "b", "d")
my_data$second_entry <- c("x", "y", "z") # and so on

shinyUI(navbarPage(theme=shinytheme("flatly"), 
  'App Name',
 tabPanel('Title',
           # Sidebar with a slider input for number of bins
           sidebarLayout(
             sidebarPanel(
               width=3,
            

              
              # new box
              checkboxGroupButtons(
                'name',
                'label:',
                choices = sort(my_data$first_value),
                status = 'primary',
            
                 selected = sort(my_data$first_value)[1],
                size = 'xs'
                # inline = TRUE
              ))





服务器.R

shinyServer(function(input, output, session) {
  data <- reactive({
    invalidateLater(100000,session)
    
    get_data()
  })

  output$data <- renderUI({
    data()
    })
})

两个问题:

  1. 有什么方法可以正确引用 my_data 吗?
  2. 如果我的函数 get_data 只是读取系统更新的(大)csv。有没有比我现在做的更好的方法?

【问题讨论】:

  • 两件事:(1) uiOutput 需要 shinyUI(...) 之外,而不是在它之外。 (2) renderUI 需要返回一个 UI 元素,例如 selectInput 或类似的。你想让output$data 看起来像什么?
  • 感谢您的回复。第一条评论:注意到但在我的情况下相当困难。您可以将普通代码放入不是某种输出的 ShinyUI 中吗? Secondsly: output$data 将是一个向量列表。将更详细地编辑问题
  • 是的,那么什么类型的 HTML 元素会显示向量列表? textAreaInput 用于查看原始值。
  • @r2evans 我已更改问题以包含一个更好的示例来说明我正在尝试做的事情

标签: r shiny


【解决方案1】:

我想您想知道如何为 UI 元素中的某些内容定义可能的choices=,此时数据既 (1) 在开始时未定义,并且 (2) 定期更改。答案是将其定义为“空”并在找到新数据时对其进行更新。

library(shiny)
library(shinyWidgets)

get_data <- function() as.list(mtcars[sample(nrow(mtcars), size=3), sample(ncol(mtcars), size=3)])
logg <- function(...) message(paste0("[", format(Sys.time()), "] ", ...))

shinyApp(
  ui = fluidPage(
    title = "Hello",
    checkboxGroupButtons(inputId = "cb", label = "label:", choices = c("unk"), selected = NULL,
                         status = "primary", size = "xs"),
    br(),
    textOutput("txt"),
    br(),
    textAreaInput("txtarea", NULL, rows = 4)
  ),
  server = function(input, output, session) {
    data <- reactive({
      logg("in 'data'")
      invalidateLater(3000, session)
      get_data()
    })
    observe({
      logg("in 'observe'")
      req(length(data()) > 0)
      updateCheckboxGroupButtons(session = session, inputId = "cb", choices = names(data()))
      updateTextAreaInput(session, "txtarea", value = paste(capture.output(str(data())), collapse = "\n"))
    })
    output$txt <- renderPrint({
      logg("in 'txt'")
      req(length(data()) > 0)
      str(data())
    })
  }
)

请注意,checkboxGroupButtons 的定义开始时没有真正的选择。我更喜欢从空开始,但与selectInput 和类似函数不同,它不喜欢从空向量开始。它很快(几乎立即)改变了,所以我在界面中看不到"unk"

我演示了两种以原始形式“显示”数据的选项:作为输出"txt",以及作为可更新输入"txtarea"。我喜欢后者,因为它可以很好地处理固定宽度,但它需要一个 update* 函数(这真的没什么大不了的)。

【讨论】:

  • 抱歉耽搁了 - 我花了一段时间才让它工作,但它工作得很好。谢谢!
猜你喜欢
  • 2020-06-18
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2017-09-07
  • 2021-11-15
  • 2018-07-17
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多