使用 Shiny 输入动态地将列添加到数据框
Dynamically add columns to dataframe using Shiny input
我正在尝试为用户创建一种可能性,以便在按下操作按钮时向 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)
有人可以帮助如何在按下操作按钮(“add_btn”)时动态地将列添加到数据框,以便将输入填充到新列中。
我找到了添加行的解决方案,但没有找到任何帮助如何添加列的帖子。
编辑:
根据 TextInputs 的数量,我想创建一些列,其中包含在 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)
我正在尝试为用户创建一种可能性,以便在按下操作按钮时向 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)
有人可以帮助如何在按下操作按钮(“add_btn”)时动态地将列添加到数据框,以便将输入填充到新列中。 我找到了添加行的解决方案,但没有找到任何帮助如何添加列的帖子。
编辑: 根据 TextInputs 的数量,我想创建一些列,其中包含在 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)