将数据附加到 R 中的现有数据框
Append data to existing dataframe in R
嗨,有没有一种方法可以将数据附加到 R 中的现有数据。例如,下面的应用程序根据用户值填充了数据框,但现在,它只是创建新行而不是附加。
我们可以附加这个数据框吗?我也尝试使用反应值。但是没有用。
有办法实现吗?
library(shiny)
library(tidyr)
library(dplyr)
library(purrr)
ui <- basicPage(
fluidRow(
column(
width = 6,
textInput('a', 'Text A',"a1"),
textInput('b', 'Text B',"b1"),
textInput('c', 'Text A',"c1"),
textInput('d', 'Text B',"d1"),
textInput('e', 'Text A',"e1"),
textInput('f', 'Text B',"f1"),
uiOutput('f1')
),
column(
width = 6,
tags$p(tags$span(id = "valueA", "")),
tags$script(
"$(document).on('shiny:inputchanged', function(event) {
if (event.name === 'a') {
$('#valueA').text(event.value);
}
});
"
)
,tableOutput('show_inputs')
)
)
)
server <- shinyServer(function(input, output, session){
output$f1 <- renderUI({
if(input$a == "a2"){
textInput('z', 'Text B',"z1")
} else {
NULL
}
})
AllInputs <- reactive({
x <- reactiveValuesToList(input)
# print(x)
# data.frame(
# names = names(x),
# values = paste0(unlist(x, use.names = FALSE), Sys.time())
# )
tibble(
key = names(x),
data = x
) %>%
mutate(data = map(data, as.character)) %>%
unnest(data)
})
# observe({
# if(file.exists("file.csv")){
# write.table(AllInputs(), "file.csv", sep = ",", col.names = F, append = T, row.names = F)
# } else {
# write.csv(AllInputs(), "file.csv", sep = ",", row.names = F)
# }
#
# })
output$show_inputs <- renderTable({
t(AllInputs())
})
})
shinyApp(ui = ui, server = server)
您需要维护一个 reactiveVal
来保存您的行并在更改时附加到它:
library(shiny)
library(tidyr)
library(dplyr)
library(purrr)
ui <- basicPage(
fluidRow(
column(
width = 6,
textInput("a", "Text A","a1"),
textInput("b", "Text B","b1"),
textInput("c", "Text A","c1"),
textInput("d", "Text B","d1"),
textInput("e", "Text A","e1"),
textInput("f", "Text B","f1"),
uiOutput("f1")
),
column(
width = 6,
tags$p(tags$span(id = "valueA", "")),
tags$script(
"$(document).on('shiny:inputchanged', function(event) {
if (event.name === 'a') {
$('#valueA').text(event.value);
}
});"
),
tableOutput("show_inputs")
)
)
)
server <- shinyServer(function(input, output, session){
my_data <- reactiveVal(list(character(0)) %>%
rep(7) %>%
set_names(letters[c(1:6, 26)]) %>%
as_tibble())
output$f1 <- renderUI({
if(input$a == "a2"){
textInput("z", "Text B", "z1")
} else {
NULL
}
})
observe({
new_row <- reactiveValuesToList(input)
dat <- isolate(my_data())
my_data(bind_rows(dat, new_row))
})
output$show_inputs <- renderTable({
req(my_data())
})
})
shinyApp(ui = ui, server = server)
请注意,如果您更改 input$a1
中的值,您将需要一些额外的逻辑来避免动态 input$f1
仍然保留文本。
嗨,有没有一种方法可以将数据附加到 R 中的现有数据。例如,下面的应用程序根据用户值填充了数据框,但现在,它只是创建新行而不是附加。
我们可以附加这个数据框吗?我也尝试使用反应值。但是没有用。 有办法实现吗?
library(shiny)
library(tidyr)
library(dplyr)
library(purrr)
ui <- basicPage(
fluidRow(
column(
width = 6,
textInput('a', 'Text A',"a1"),
textInput('b', 'Text B',"b1"),
textInput('c', 'Text A',"c1"),
textInput('d', 'Text B',"d1"),
textInput('e', 'Text A',"e1"),
textInput('f', 'Text B',"f1"),
uiOutput('f1')
),
column(
width = 6,
tags$p(tags$span(id = "valueA", "")),
tags$script(
"$(document).on('shiny:inputchanged', function(event) {
if (event.name === 'a') {
$('#valueA').text(event.value);
}
});
"
)
,tableOutput('show_inputs')
)
)
)
server <- shinyServer(function(input, output, session){
output$f1 <- renderUI({
if(input$a == "a2"){
textInput('z', 'Text B',"z1")
} else {
NULL
}
})
AllInputs <- reactive({
x <- reactiveValuesToList(input)
# print(x)
# data.frame(
# names = names(x),
# values = paste0(unlist(x, use.names = FALSE), Sys.time())
# )
tibble(
key = names(x),
data = x
) %>%
mutate(data = map(data, as.character)) %>%
unnest(data)
})
# observe({
# if(file.exists("file.csv")){
# write.table(AllInputs(), "file.csv", sep = ",", col.names = F, append = T, row.names = F)
# } else {
# write.csv(AllInputs(), "file.csv", sep = ",", row.names = F)
# }
#
# })
output$show_inputs <- renderTable({
t(AllInputs())
})
})
shinyApp(ui = ui, server = server)
您需要维护一个 reactiveVal
来保存您的行并在更改时附加到它:
library(shiny)
library(tidyr)
library(dplyr)
library(purrr)
ui <- basicPage(
fluidRow(
column(
width = 6,
textInput("a", "Text A","a1"),
textInput("b", "Text B","b1"),
textInput("c", "Text A","c1"),
textInput("d", "Text B","d1"),
textInput("e", "Text A","e1"),
textInput("f", "Text B","f1"),
uiOutput("f1")
),
column(
width = 6,
tags$p(tags$span(id = "valueA", "")),
tags$script(
"$(document).on('shiny:inputchanged', function(event) {
if (event.name === 'a') {
$('#valueA').text(event.value);
}
});"
),
tableOutput("show_inputs")
)
)
)
server <- shinyServer(function(input, output, session){
my_data <- reactiveVal(list(character(0)) %>%
rep(7) %>%
set_names(letters[c(1:6, 26)]) %>%
as_tibble())
output$f1 <- renderUI({
if(input$a == "a2"){
textInput("z", "Text B", "z1")
} else {
NULL
}
})
observe({
new_row <- reactiveValuesToList(input)
dat <- isolate(my_data())
my_data(bind_rows(dat, new_row))
})
output$show_inputs <- renderTable({
req(my_data())
})
})
shinyApp(ui = ui, server = server)
请注意,如果您更改 input$a1
中的值,您将需要一些额外的逻辑来避免动态 input$f1
仍然保留文本。