r-使用Shiny输入将列动态添加到数据帧中



我正试图为用户创造一种可能性,即每当按下操作按钮时,都可以在Shiny应用程序的数据帧中动态添加新列。

我找到了一个关于如何在Shiny中的另一个堆栈溢出线程上动态添加用户输入字段的解决方案。

现在,我正试图修改此代码,以便将动态添加到数据帧中。我的代码部分被注释掉了:

library(shiny)
ui <- shinyUI(fluidPage(

sidebarPanel(

actionButton("add_btn", "Add Textbox"),
actionButton("rm_btn", "Remove Textbox"),
textOutput("counter")
# ,tableOutput("table")

),

mainPanel(uiOutput("textbox_ui"))

))
server <- shinyServer(function(input, output, session) {

# Track the number of input boxes to render
counter <- reactiveValues(n = 0)

# Track all user inputs
AllInputs <- reactive({
x <- reactiveValuesToList(input)
})

observeEvent(input$add_btn, {counter$n <- counter$n + 1})
observeEvent(input$rm_btn, {
if (counter$n > 0) counter$n <- counter$n - 1
})

output$counter <- renderPrint(print(counter$n))

textboxes <- reactive({

n <- counter$n

if (n > 0) {
isolate({
lapply(seq_len(n), function(i) {
textInput(inputId = paste0("textin", i),
label = paste0("Textbox", i), 
value = AllInputs()[[paste0("textin", i)]])
})
})
}

})

# df <- reactive({
#   n <- counter$n
# 
#   df <- data.frame(placeholder=NA)
#   
#   lapply(seq_len(n), function(i){
#   df[[paste0("col", i)]] <- paste0("input$textin", i)
#   }
#   )
#   df
# })

output$textbox_ui <- renderUI({ textboxes() })

# output$table <- renderTable({
#   df()
#   
# })

})
shinyApp(ui, server)

有人能帮助如何在按下actionButton("add_btn"(时将列动态添加到数据帧中,以便将输入填充到新列中吗。我找到了添加行的解决方案,但没有找到任何有助于如何添加列的帖子。

编辑:根据textInput的数量,我想用textInput函数中填写的信息创建多个列。例如:如果用户添加了三本包含以下信息的教科书:

  • 文本框1:"A">
  • 文本框2:";B">
  • 文本框3:";C">

然后我希望创建的数据驯服看起来像这样:

df <- data.frame(Textbox1="A", Textbox2="B", Textbox3="C")

也许你正在寻找这个

library(shiny)
library(tidyr)
library(dplyr)
ui <- shinyUI(fluidPage(

sidebarPanel(

actionButton("add_btn", "Add Textbox"),
actionButton("rm_btn", "Remove Textbox"),
textOutput("counter")

),

mainPanel(uiOutput("textbox_ui")
,tableOutput("table")
)

))
server <- shinyServer(function(input, output, session) {

# Track the number of input boxes to render
counter <- reactiveValues(n = 0, df=NULL)

# Track all user inputs
AllInputs <- reactive({
x <- reactiveValuesToList(input)
})

observeEvent(input$add_btn, {
counter$n <- counter$n + 1
})
observeEvent(input$rm_btn, {

if (counter$n > 0) counter$n <- counter$n - 1

})

output$counter <- renderPrint(print(counter$n))

textboxes <- reactive({

n <- counter$n

if (n > 0) {
isolate({
lapply(seq_len(n), function(i) {
textInput(inputId = paste0("textin", i),
label = paste0("Textbox", i), 
value = AllInputs()[[paste0("textin", i)]])
})
})
}

})

output$textbox_ui <- renderUI({ textboxes() })

df1 <- data.frame()

observe({
n <- counter$n
if (n > 0) {
df1 <- data.frame()

lapply(1:n, function(i){
req(input[[paste0("textin", i)]])

df1 <<- rbind(df1,data.frame(input[[paste0("textin", i)]]))

})
}

counter$df <- df1
})

output$table <- renderTable({
if (is.null(counter$df)) return(NULL)
else {
n <- nrow(counter$df)
if (n>0) {
colnames(counter$df) <- "values"
df1 <- counter$df %>% mutate(row=row_number())
df1 %>% pivot_wider(names_prefix="Textbox", names_from = row, values_from = values)
}else return(NULL)
}
})


})
shinyApp(ui, server)

最新更新