首页 > 解决方案 > 使用闪亮的 R 使用 split() 函数动态显示 n 个表(问题已解决,谢谢)

问题描述

我制作了一个应用程序,用户在其中上传数据,然后根据列将这些数据拆分()。例如,假设我正在对 Iris 数据集进行拆分。我可能会使用 split(iris, iris$Species)。这会给我 3 个数据集(见下文)。现在我希望这三个数据集在三个表中动态显示。

因为用户每次上传的数据会不一样,所以拆分会给出不同的表数。Iris 提供了 3 个数据集,但我们可以根据数据获得任意数量的表。现在我想显示这 3 个数据集,以动态显示在 3 个表中。如果由于 split() 我有 4 个数据集,那么应该动态显示 4 个表。

我试图编写一些代码,但它给了我同一张桌子 3 次。它没有给我 3 张不同的桌子。

$setosa
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa


$versicolor
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
51           7.0         3.2          4.7         1.4 versicolor
52           6.4         3.2          4.5         1.5 versicolor
53           6.9         3.1          4.9         1.5 versicolor
54           5.5         2.3          4.0         1.3 versicolor
55           6.5         2.8          4.6         1.5 versicolor
56           5.7         2.8          4.5         1.3 versicolor



$virginica
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
101          6.3         3.3          6.0         2.5 virginica
102          5.8         2.7          5.1         1.9 virginica
103          7.1         3.0          5.9         2.1 virginica
104          6.3         2.9          5.6         1.8 virginica
105          6.5         3.0          5.8         2.2 virginica
106          7.6         3.0          6.6         2.1 virginica

标签: rshinyshinydashboardshiny-servershinyapps

解决方案


我通过创建一个拆分数据集的反应式表达式对代码进行了一些更改,这并不是真正需要的(仅使用 iris 数据集),但是当添加用户输入时它会派上用场。

library(shiny)
library(tidyverse)
data(iris)



server <- function(input, output, session) {
    #instead  of iris$Species an input$... can be passed
    Splitdfs <- reactive({split(iris, iris$Species)}) 
    
    output$data <- renderUI({
        
        tables <- map(Splitdfs() , ~{
            renderDataTable({.x})
        })
        mainPanel(tables)
        
    })
    
}



ui <- fluidPage(
    titlePanel(title = h4("Iris Dataset", align="center")),
    sidebarLayout(
        sidebarPanel(),   
        uiOutput("data") #the ui will contain all the split tables.
    ))

#run the app
shinyApp(ui, server)

reprex 包于 2021-05-31 创建 (v2.0.0 )


推荐阅读