[英]Object not found R Shiny
我正在尝试将在一个渲染函数中创建的数据帧访问到另一个渲染函数中。
有两个服务器输出,lvi 和 Category,在 lvi 中我创建了 Data1 数据框和 Category 我创建了 Data2 数据框。 我想选择 Data2,其中 Data1 ID 匹配。
我正在按照以下步骤实现我的目标,但出现错误“未找到对象数据 1”。
我的用户界面是
ui <- fluidPage(
# App title ----
titlePanel("Phase1"),
fluidPage(
column(4,
# Input: Select a file ----
fileInput("file1", "Import file1")
)
),
fluidPage(
column(4,
# Input: Select a file ----
fileInput("file2", "Import File2")
)
),
# Main panel for displaying outputs ----
mainPanel(
# Output: Data file ----
dataTableOutput("lvi"),
dataTableOutput("category")
)
)
我的服务器代码是
server <- function(input, output) {
output$lvi <- renderDataTable({
req(input$file1)
Data1 <- as.data.frame(read_excel(input$file1$datapath, sheet = "Sheet1"))
})
output$category <- renderDataTable({
req(input$file2)
Data2 <- as.data.frame(read_excel(input$file2$datapath, sheet = "Sheet1"))
Data2 <- Data2[,c(2,8)]
Data2 <- Data2[Data1$ID == "ID001",]
})
}
shinyApp(ui, server)
一旦反应块执行完毕,其中的所有元素都会消失,就像一个函数一样。 唯一幸存下来的是从该块“返回”的内容,它通常是块中的最后一个表达式(或者,当在真正的function
,是return(...)
某些东西)。 如果您将反应式(并观察)块视为“函数”,您可能会意识到,函数外部的东西唯一知道函数内部发生的事情是函数是否以某种方式显式地返回它。
考虑到这一点,你在一个render
/反应块内获得一个帧的方式是不在那个反应块内计算它:相反,在它自己的数据reactive
块中创建该帧并在render
和另一个中使用它render
。
试试这个(未经测试):
server <- function(input, output) {
Data1_rx <- eventReactive(input$file1, {
req(input$file1, file.exists(input$file1$datapath))
as.dataframe(read_excel(input$file1$datapath, sheet = "Sheet1"))
})
output$lvi <- renderDataTable({ req(Data1_rx()) })
output$category <- renderDataTable({
req(input$file2, file.exists(input$file2$datapath),
Data1_rx(), "ID" %in% names(Data1_rx()))
Data2 <- as.data.frame(read_excel(input$file2$datapath, sheet = "Sheet1"))
Data2 <- Data2[,c(2,8)]
Data2 <- Data2[Data1_rx()$ID == "ID001",]
})
}
shinyApp(ui, server)
但既然我们已经走上了“更好的设计”和“最佳实践”的道路,那么让我们将 data2 和 data2 过滤框架分开......你现在可能不会单独使用它,但通常更好将“加载/生成帧”与“渲染成漂亮的东西”分开。 这样,如果您需要了解有关加载的数据的某些信息,则不必 (a) 在其他地方重新加载,效率低下; 或 (b) 尝试破解闪亮的 DataTable 对象的内部结构并手动获取它。 (这两个想法都非常糟糕。)
因此,一个稍微好一点的解决方案可能始于:
server <- function(input, output) {
Data1_rx <- eventReactive(input$file1, {
req(input$file1, file.exists(input$file1$datapath))
as.dataframe(read_excel(input$file1$datapath, sheet = "Sheet1"))
})
Data2_rx <- eventReactive(input$file2, {
req(input$file2, file.exists(input$file2$datapath))
dat <- as.dataframe(read_excel(input$file2$datapath, sheet = "Sheet1"))
dat[,c(2,8)]
})
Data12_rx <- reactive({
req(Data1_rx(), Data2_rx())
Data2_rx()[ Data1_rx()$ID == "ID001", ]
})
output$lvi <- renderDataTable({ req(Data1_rx()); })
output$category <- renderDataTable({ req(Data12_rx()); })
}
shinyApp(ui, server)
虽然这段代码有点长,但它也将“数据加载/调整”和“将数据呈现为漂亮的东西”组合在一起。 如果您需要查看早期数据或过滤后的数据,它就在那里。
(旁注:您可能从中看到的一个性能影响是,您现在有更多的数据副本在浮动。只要您不处理“大”数据,这并不是什么大问题。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.