【问题标题】:Render box and contents dynamically from dataframe in shiny从闪亮的数据框中动态渲染框和内容
【发布时间】:2021-05-15 00:53:25
【问题描述】:

我正在处理仪表板,我想使用数据框来生成框和描述。我可以使用 lapply 来制作盒子,但我不知道如何从数据框中提取描述。到目前为止我有(没有描述):

library(shiny)
library(shinydashboard)

dataset <- data.frame("title" = c("A","B","C"), "description" = c("Info about box A", "Info about box B","Info about box C"), "data" = c(1:3))

ui <- fluidPage(      
  titlePanel("Dynamic Boxes"),      
  fluidRow(
    uiOutput("boxes")
  )
)

dataset <- data.frame("title" = c("A","B","C"), "description" = c("Stuff about box A", "Stuff about box B","Stuff about box C"), "data" = c(1:3))


server <- function(input, output) {      
  output$boxes <- renderUI({
    lapply(dataset[,'title'], function(a) {
      
      box(title = a, p("say stuff here"))
    })
  })
}

我无法找出正确的逻辑来提取描述。

我试过mapply:

server <- function(input, output) {      
  output$boxes <- renderUI({
    mapply(function(x,y) {
      
      box(title = x, p(y)
      )
    }, x = dataset[,'title'], y = dataset[,'description']
  )
  })
}

但我不知道我在做什么。你能帮忙吗?

编辑: 我可以使用上面的虚拟数据使用mapplySIMPLIFY=FALSElapply 让仪表板工作

server <- function(input, output) {      
  output$boxes <- renderUI({
    lapply(dataset[,'title'], function(a) {
      
      box(title = a, p(dataset[dataset$title==a,2]))
    })
  })
}

但我无法让它与真实数据一起工作,并且无法用“虚拟”数据复制问题。

我的真实数据位于数据库中的服务器上。

【问题讨论】:

  • 在此示例中,dataset3 也没有出现错误,我无法用虚拟数据复制问题,也许问题出在真实数据集中?
  • 我发现了问题!数据集有多个不间断空格 utf 字符 删除这些修复了问题。该应用程序现在按预期运行。

标签: r shiny shinydashboard


【解决方案1】:

这应该可以工作

server <- function(input, output) {      
  output$boxes <- renderUI({
    lapply(dataset[,'title'], function(a) {
      
      box(title = a, p(dataset[dataset$title==a,2]))
    })
  })
}

【讨论】:

  • 这很好用,但就像 Ronak 的建议一样,应用程序在从数据库中提取数据时会崩溃。在一种情况下,当我使用 read.csv 时,我可以正确填充这些框,但是当我尝试从数据库中提取数据甚至使用 read_csv 时,应用程序会崩溃。它会弹出一秒钟然后崩溃。你有什么想法?可能是冲突还是与小问题有关?
  • 我发现了问题,它是由数据集中的utf字符引起的;具体来说, 不间断的空白。
【解决方案2】:

mapply 的方法是正确的,您需要包含 SIMPLIFY = FALSE 以便它返回一个列表。

server <- function(input, output) {      
  output$boxes <- renderUI({
    mapply(function(x,y) {
      box(title = x, p(y)
      )
    }, x = dataset[,'title'], y = dataset[,'description'], SIMPLIFY = FALSE
    )
  })
}

或者使用Map,它总是返回一个列表。

server <- function(input, output) {      
  output$boxes <- renderUI({
    Map(function(x,y) box(title = x, p(y)), dataset$title, dataset$description)
  })
}

【讨论】:

  • 这对“虚拟”数据框非常有效,但是当我尝试使用真实数据时出现错误。在一种情况下,当我使用 read.csv 时,我可以正确填充这些框,但是当我尝试从数据库中提取数据甚至使用 read_csv 时,应用程序会崩溃。它会弹出一秒钟然后崩溃。你有什么想法?可能是冲突还是与小问题有关?
  • 我也试过了,结果还是一样,可惜
  • 我无法提供示例,因为问题可能出在数据集中,因为我还没有弄清楚如何复制我看到的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2014-10-22
  • 2017-05-05
  • 1970-01-01
  • 2022-11-15
  • 2018-08-14
相关资源
最近更新 更多