0

我想更新 R Shiny 代理表中的列标题。该应用程序应该:

  1. 使用原始列标题名称启动(例如“Do”、“Re”、“Mi”、“Fa”、“So”)
  2. 当用户单击操作按钮时,将代理表中的那些列标题更改为其他内容(例如“y1”、“y2”、“y3”、“y4”、“y5”)

Shiny 有一个方便的 updateCaption() 方法,它允许代理表标题的类似行为。我想对代理表的表列标题做类似的事情。这是我的尝试。

library(shiny)
library(DT)

ui <- fluidPage(

  fluidRow(
    actionButton(
      "updatebutton",
      label = "Update Table",
      style = "margin-right: 5px;"
    ),
    DT::dataTableOutput("myplot")
  ),
)

server <- function(input, output) {

  mycolumnnames <-c("Do","Re","Mi","Fa","So")
  myothercolumnnames <- c("y1","y2","y3","y4","y5")
  output$myplot <- DT::renderDataTable({
    DF <- data.frame(replicate(5, sample(rnorm(5), 10, rep = TRUE)))
    datatable(DF, colnames = mycolumnnames,
              caption="Original caption")
  })

  proxy <- DT::dataTableProxy("myplot")

  observeEvent(input$updatebutton, {
    updateCaption(proxy, caption="Look, I am a NEW caption!")
    DF <- data.frame(replicate(5, sample(rnorm(5), 10, rep = TRUE)))
    # names(DF) <- myothercolumnnames # This doesn't work
    proxy %>% replaceData(DF)
  })
}

shinyApp(ui = ui, server = server)
4

1 回答 1

0

Edit1:现在使用dataTableProxy()

我拿走了所有与颜色背景相关的东西,所以我可以专注于你的问题。

首先,我在 Shiny 之外声明了一些值:您的 data.frame 和两个用于列名的向量。然后我将列名指定为第一个向量。

在应用程序内部,我将数据检索为,并在按下按钮时reactiveVal()更新它colnames

library(shiny)
library(DT)

mycolumnnames <-c("Do","Re","Mi","Fa","So")
myothercolumnnames <- c("y1","y2","y3","y4","y5")
DF <- data.frame(replicate(5, sample(rnorm(5), 10, rep = TRUE)))
colnames(DF) <- mycolumnnames

ui <- fluidPage(
  
  fluidRow(
    actionButton(
      "updatebutton",
      label = "Update Table",
      style = "margin-right: 5px;"
    ),
    DT::dataTableOutput("myplot")
  ),
)

server <- function(input, output) {
  
  df <- reactiveVal(DF)
  
  output$myplot <- DT::renderDataTable({
    datatable(df(), caption="Original caption")
  })
  
  observeEvent(input$updatebutton, {
    new_data <- data.frame(replicate(5, sample(rnorm(5), 10, rep = TRUE)))
    
    if(!input$updatebutton %% 2 == 0 ){
      colnames(new_data) <- myothercolumnnames
    } else {
      colnames(new_data) <- mycolumnnames 
    }
    df(new_data)
    proxy1 <- DT::dataTableProxy("myplot")
    updateCaption(proxy1, caption="Look, I am a NEW caption!")
    replaceData(proxy1, df())
  })
}

shinyApp(ui = ui, server = server)


因此,每当您按下按钮时,两个向量之间的列名都会发生变化。

于 2021-11-15T19:19:27.673 回答