1

目前,我正在尝试使用单个 uiOutput() 将我通过 api 调用检索到的多个表输出到仪表板页面上。

从这篇文章中获得了一些参考: R Shiny - Display multiple plots selected with checkboxGroupInput

然而,虽然我成功地将其放入整体布局的列表并将其输出到 uioutput() 中,但由于所有表都相同,我无法达到预期的结果,实际上它应该是不同的,因为我有已经为每个 renderdatatable() 标记了一个唯一的数据框,下面显示了屏幕截图和代码。在这里会很感激一些帮助谢谢![1]:https ://i.stack.imgur.com/W0B26.png

library(httr)
library(jsonlite)
library(plyr)
library(data.table)
library(rlist)
library(shiny)
###########  UI   ############
ui <- fluidPage(uiOutput('datatables'))


#########  SERVER  ###########3
server <- function(input, output, session){
  output$datatables <- renderUI({
    link <- 'https://api.zapper.fi/v1/protocols/balances/supported?addresses%5B%5D=0x58bbae0159117a75225e72d941dbe35ffd99f894&api_key=96e0cc51-a62e-42ca-acee-910ea7d2a241'
    
    test <- GET(link)
    test <- fromJSON(rawToChar(test$content))

    counter1 <- 0
    out <- list()
    df <- list()
    for (i in seq(from = 1, to = length(test$network))){
      network <- test$network[i]
      #counter <- counter + 1
      out <- list(out, h2(paste0(str_to_title(network),' Network')))
      for (e in ldply(test$protocols[i], data.frame)$protocol){
        link1 <- paste0(paste0('https://api.zapper.fi/v1/protocols/',e),paste0(paste0('/balances?addresses%5B%5D=0x58bbae0159117a75225e72d941dbe35ffd99f894&network=',network),'&api_key=96e0cc51-a62e-42ca-acee-910ea7d2a241'))
        data <- fromJSON(rawToChar(GET(link1)$content))
        wallet <- '0x58bbae0159117a75225e72d941dbe35ffd99f894'
        #info <- ldply(eval(parse(text=sprintf("data$'%s'$products$assets",wallet))),data.frame)
        out <- list(out, h3(paste0(str_to_title(e),' Protocol')))
        counter1 <- counter1 + 1
        df[[counter1]] <- ldply(eval(parse(text=sprintf("data$'%s'$products$assets",wallet))),data.frame)
        out<- list(out, renderDataTable(df[[counter1]]))
}
}
return(out)
})
}
shinyApp(ui, server)

更新:我还尝试将其包装在 OBSERVE() 和 LOCAL () 中以获得不同的输出,但仍然没有达到预期的结果,所有相同的表格都是错误的

4

1 回答 1

0

我几乎使用以下代码达到了预期的结果:

library(httr)
library(jsonlite)
library(plyr)
library(data.table)
library(rlist)
library(shiny)
# added :
library(DT)
library(stringr)
###########  UI   ############
ui <- fluidPage(
  uiOutput('datatables')
  )


#########  SERVER  ###########
server <- function(input, output, session){
  link <- 'https://api.zapper.fi/v1/protocols/balances/supported?addresses%5B%5D=0x58bbae0159117a75225e72d941dbe35ffd99f894&api_key=96e0cc51-a62e-42ca-acee-910ea7d2a241'
  
  test <- GET(link)
  test <- fromJSON(rawToChar(test$content))
  
  output$datatables <- renderUI({
    
    outputlist <- lapply(1:length(test$network), function(i) {
      network <- test$network[i]
      networkTitle <- paste0("networktitle", i)
      
      lapply(seq_along(ldply(test$protocols[i], data.frame)$protocol), function(j) {
      
      protocolTitle <- paste0("protocoltitle", i, j)
      outputId <- paste0("network", i, "protocol", j)
      
      tagList(
        #uiOutput(networkTitle),
        uiOutput(protocolTitle),
        DTOutput(outputId)
      )
      })
    })
  })
  
  lapply(1:length(test$network), function(i) {
    network <- test$network[i]
    my_i <- i
    networkTitle <- paste0("networktitle", my_i)
      
    #local({
    #  my_network <- network
    #  output[[networkTitle]] <- renderUI({
    #    tags$h2(paste0(str_to_title(my_network),' Network'))
    #  })
    #})
    
      lapply(seq_along(ldply(test$protocols[my_i], data.frame)$protocol), function(j) {
        
        e <- ldply(test$protocols[my_i], data.frame)$protocol[[j]]
        
        local({
          my_network <- network
          my_e <- e
          my_j <- j
          protocolTitle <- paste0("protocoltitle", my_i, my_j)
          outputId <- paste0("network", my_i, "protocol", my_j)
          link1 <- paste0(paste0('https://api.zapper.fi/v1/protocols/',my_e),paste0(paste0('/balances?addresses%5B%5D=0x58bbae0159117a75225e72d941dbe35ffd99f894&network=',my_network),'&api_key=96e0cc51-a62e-42ca-acee-910ea7d2a241'))
          data <- fromJSON(rawToChar(GET(link1)$content))
          wallet <- '0x58bbae0159117a75225e72d941dbe35ffd99f894'

          output[[protocolTitle]] <- renderUI({
            tags$h3(paste0(str_to_title(my_network),' Network - ', str_to_title(my_e),' Protocol'))
          })
          
          output[[outputId]] <- renderDT({
            ldply(eval(parse(text=sprintf("data$'%s'$products$assets",wallet))),data.frame)
          })
        })
      })

  })

  }
  
shinyApp(ui, server)

我使用了两个嵌套lapply,但这可能也适用于 for 循环(使用local())。

正如你所提到的,我们在这里有几个困难:

  1. 需要用于local()获取每个协议标题和数据表的唯一 ID(请参阅
  2. 需要renderUI在服务器部分使用一个来动态生成几种类型的输出(用于标题的 uiOutput,用于数据表的 DTOutput),所有这些都包含在tagList(). 再次看到这个这个
  3. 需要使用两个嵌套的 for 循环/lapply 函数来渲染renderUI()零件中使用的闪亮输出。

我组合了网络和协议标题,因为我无法将网络标题作为唯一的 h2 标题,如您的示例图中所示。使用注释代码时,仍然会为 h2 标题生成重复的输出 ID。如果有人想尝试改进它,我会让注释代码作为参考。

于 2021-08-03T10:58:36.000 回答