观察事件中闪亮的反应数据集
Posted
技术标签:
【中文标题】观察事件中闪亮的反应数据集【英文标题】:Shiny reactive dataset within observeEvent 【发布时间】:2018-05-26 03:54:21 【问题描述】:我有一个非常简单的应用程序失败了。它失败的原因是反应数据集仅在 observeEvent 函数内可用,而在外部不可用。我使用 observeEvent 从两个不同的来源获取数据集。对于这个例子,我只是使用了 cbind。我的实际代码要复杂得多。
这是一个与逻辑/语法相关的问题,但我的所有搜索都失败了。本质上,我希望 merge_data() 可用于应用程序的所有部分。
最小重复示例 - 这失败因为 merge_data() 在 ObserveEvent 之外不可用。
library(shiny)
library(shinyjs)
library(DT)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("testing 1 2 3"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
),
# Show a plot of the generated distribution
mainPanel(
fluidRow(
column(width = 2,
offset = 0,
align = "center",
actionButton(inputId = "fetch_data_inputId",
label = "data")
) #column
,
column(width = 10,
offset = 0,
align = "center",
DT::dataTableOutput("DT1")
) #column
)#fluidrow
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output,session)
observeEvent(input$fetch_data_inputId,
req(iris)
button_data <- colnames(iris)
merged_data <- reactive(
if( !is.null(cbind(iris[,1:4],iris3)))
cbind(iris[,1:4],iris3)
else NULL
)
) #observeevent
output$DT1 <- renderDataTable(#
rendered_table <- merged_data()
DT::datatable(rendered_table)
)
# Run the application
shinyApp(ui = ui, server = server)
最小重复示例 - 这有效,因为数据表是在 ObserveEvent 中创建的。
library(shiny)
library(shinyjs)
library(DT)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("testing 1 2 3"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
),
# Show a plot of the generated distribution
mainPanel(
fluidRow(
column(width = 2,
offset = 0,
align = "center",
actionButton(inputId = "fetch_data_inputId",
label = "data")
) #column
,
column(width = 10,
offset = 0,
align = "center",
DT::dataTableOutput("DT1")
) #column
)#fluidrow
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output,session)
observeEvent(input$fetch_data_inputId,
req(iris)
button_data <- colnames(iris)
merged_data <- reactive(
if( !is.null(cbind(iris[,1:4],iris3)))
cbind(iris[,1:4],iris3)
else NULL
)
output$DT1 <- renderDataTable(#
rendered_table <- merged_data()
DT::datatable(rendered_table)
)
) #observeevent
# Run the application
shinyApp(ui = ui, server = server)
我真正需要的是在 observeEvent 中继续创建反应性数据集,但可以在 ObserveEvent 环境之外访问,以便我在应用程序的其他部分使用它,但我怀疑这是错误的方法。所以任何有效的东西都会很棒。
【问题讨论】:
尝试使用reactiveValue
而不是reactive
。
你可以这样做merged_data <- eventReactive(input$fetch_data_inputId, ......
,这样你就不需要observeEvent
。
谢谢你们两位的cmets。如果我对 reactiveValue 子反应,第一段代码会继续出错。使用 eventReactive 替换 observeEvent 也会继续出错。在这两种情况下,错误都是“警告:merged_data 中的错误:找不到函数“merged_data”
如果你定义了merged_data <- eventReactive(input$fetch_data_inputId, ......
,没有理由找不到这个函数。你在某个地方做错了。您是否删除了observeEvent
?
斯蒂芬,你是对的。我用 eventReactive 替换了 observeEvent,而您没有建议这样做。它现在起作用了——你应该把它记下来作为答案。
【参考方案1】:
library(shiny)
library(shinyjs)
library(DT)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("testing 1 2 3"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
),
# Show a plot of the generated distribution
mainPanel(
fluidRow(
column(width = 2,
offset = 0,
align = "center",
actionButton(inputId = "fetch_data_inputId",
label = "data")
) #column
,
column(width = 10,
offset = 0,
align = "center",
DT::dataTableOutput("DT1")
) #column
)#fluidrow
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output,session)
merged_data <- eventReactive(input$fetch_data_inputId,
req(iris)
button_data <- colnames(iris)
if( !is.null(cbind(iris[,1:4],iris3)))
cbind(iris[,1:4],iris3)
else NULL
) #eventReactive
output$DT1 <- renderDataTable(#
rendered_table <- merged_data()
DT::datatable(rendered_table)
)
# Run the application
shinyApp(ui = ui, server = server)
【讨论】:
以上是关于观察事件中闪亮的反应数据集的主要内容,如果未能解决你的问题,请参考以下文章