[英]Add row number column to a reactive data frame in Shiny
我正在尝试将行索引列添加到根据用户输入即时创建的反应式数据框中。 我可以使用 tibble::rowid_to_column function 在 Shiny 之外执行此操作,但无法使其在下面的 Shiny 应用程序(第 44 行)中工作。 有人可以提供有关如何使其工作的指导吗? 另外,当我从数据框中删除一行时,我们如何才能使 rowid 数字再次连续? 谢谢。
library(shiny)
library(DT)
library(tidyverse)
input_data <- data.frame(
# rowid = double(),
input1 = character(),
input2 = double(),
stringsAsFactors = FALSE)
ui <- fluidPage(
titlePanel("Title"),
sidebarLayout(
sidebarPanel(
selectInput("input1",
"Input 1",
choices = c("Value 1", "Value 2", "Value 3")),
numericInput("input2",
"Input 2",
value = 100),
actionButton("add_btn",
"Add Row"),
actionButton("delete_btn",
"Delete Row"),
actionButton("reset_btn",
"Reset"),
position = "left"
),
mainPanel(
DT::dataTableOutput("input_table")
)
)
)
server <- function(input, output) {
input_table <- reactiveVal(input_data)
observeEvent(input$add_btn, {
t = rbind(input_table(), data.frame(col1 = input$input1, col2 = input$input2))
# %>%
# cbind(tibble::rowid_to_column("rowid"))
input_table(t)
})
observeEvent(input$delete_btn, {
t = input_table()
print(input$input_table_rows_selected)
if (!is.null(input$input_table_rows_selected)) {
t <- t[-input$input_table_rows_selected,]
}
input_table(t)
})
observeEvent(input$reset_btn, {
input_table(input_data)
})
output$input_table <- DT::renderDataTable({
datatable(input_table())
})
}
shinyApp(ui = ui, server = server)
rowid_to_column()
添加 tibble 的行名称并将它们作为列添加到数据框中。 这对您不起作用:一旦您在列rowid
中添加了行名,就不能再次添加该列。 此外,function 返回添加了新列的整个 tibble,因此将cbind()
的 output rowid_to_column()
() 到 tibble 是没有意义的。
我建议对您的代码进行以下更改:
使用 rowid 列定义初始表:
input_data <- tibble(
rowid = integer(),
input1 = character(),
input2 = double()
)
在第一个观察者中,将代码更改为:
observeEvent(input$add_btn, {
new_row <- tibble(rowid = nrow(input_table()) + 1,
input1 = input$input1,
input2 = input$input2)
t = bind_rows(input_table(), new_row)
input_table(t)
})
这将创建一个具有适当 rowid 的新行,然后将其添加到表中。
为了在删除一行后获得预期的 rowid,您只需在每次删除一行时重新定义 rowid:
observeEvent(input$delete_btn, {
t <- input_table()
print(input$input_table_rows_selected)
if (!is.null(input$input_table_rows_selected)) {
t <- t[-input$input_table_rows_selected, ]
# reset the rowids only, when there is at least one row left
if (nrow(t) > 0) {
t$rowid <- 1:nrow(t)
}
}
input_table(t)
})
在呈现 output 表时,您必须抑制行名称:
output$input_table <- DT::renderDataTable({
datatable(input_table(), rownames = FALSE)
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.