r-RShiny:引用服务器中UI中的数据



示例案例:我的全局中有一个函数。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(在开始时未定义,(2(周期性变化时,如何为UI元素中的某些内容定义可能的choices=。答案是将其定义为";"空";并在发现新数据时对其进行更新。

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*函数(这真的不是什么大不了的事(。

最新更新