#r #shiny #rscript #rshiny
Вопрос:
Кнопки «SplitColumns», «Удаление» и «Изменение значений» показаны в приведенном ниже коде R shiny; согласно коду, после загрузки данных csv кнопки «SplitColumns» и «Удаление» работают безупречно. Чтобы сделать это еще более полезным, я хотел бы добавить пустой столбец после указанного пользователем столбца(в соответствии с selectInput : помечено: «выберите столбец») и заменить значения в поле с надписью » Введите значение для замены:»
Для этого я создал функцию под названием «значения заполнения», однако она не работает и выдает мне следующую ошибку.
Может ли кто-нибудь помочь мне решить эту проблему?
Ошибка
Предупреждение: Ошибка в под: объект «df_fill» не найден
данные csv
ID Type Range
21 A1 B1 100
22 C1 D1 200
23 E1 F1 300
приложение.R
library(shiny)
library(reshape2)
#source('splitColumn_stack.R')
library(DT)
###function for deleting the rows
splitColumn <- function(data, column_name) {
newColNames <- c("Unmerged_type1", "Unmerged_type2")
newCols <- colsplit(data[[column_name]], " ", newColNames)
after_merge <- cbind(data, newCols)
after_merge[[column_name]] <- NULL
after_merge
}
###_______________________________________________
### function for replacing the empty values
library(tidyr)
fillvalues <- function(columName, value){
df_fill[[columName]] <- sub("^$", value , df_fill[[columName]])
df_fill
}
### use a_splitme.csv for testing this program
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
fileInput("file1", "Choose CSV File", accept = ".csv"),
checkboxInput("header", "Header", TRUE),
actionButton("Splitcolumn", "SplitColumn"),
selectInput(inputId='selectcolumn', label='select column', ''),
actionButton("deleteRows", "Delete Rows"),
textInput("textbox", label="Input the value to replace:"),
actionButton("replacevalues", label = 'Replace values')
),
mainPanel(
DTOutput("table1")
)
)
)
server <- function(session, input, output) {
rv <- reactiveValues(data = NULL)
observeEvent(input$file1, {
file <- input$file1
ext <- tools::file_ext(file$datapath)
req(file)
validate(need(ext == "csv", "Please upload a csv file"))
rv$data <- read.csv(file$datapath, header = input$header)
updateSelectInput(session, 'selectcolumn', 'select column', names(rv$data))
})
observeEvent(input$Splitcolumn, {
rv$data <- splitColumn(rv$data, input$selectcolumn)
})
observeEvent(input$deleteRows,{
if (!is.null(input$table1_rows_selected)) {
rv$data <- rv$data[-as.numeric(input$table1_rows_selected),]
}
})
output$table1 <- renderDT({
rv$data
})
observeEvent(input$replacevalues, {
rv$value <- fillvalues(rv$value, input$selectcolumn)
})
}
shinyApp(ui, server)
Комментарии:
1. Не уверен, что я понимаю, вы хотите создать новый столбец, содержащий значения, записанные пользователем в «текстовом поле»
textInput
?2. Да, это правильно. Кроме того, после определенного столбца (из которого мы выбираем
selectInput
) следует добавить новый столбец.3. @julien.leroux5 Вам нужна какая-либо другая информация о моих ожиданиях?
Ответ №1:
Нет необходимости «заменять» какие-либо значения, просто вставьте новый столбец со значениями, введенными пользователем.
Ниже приведен пример использования add_column()
функции из tibble
пакета.
Имейте в виду, что это всего лишь отправная точка, где пользователь должен ввести нужное количество значений, соответствующих количеству строк в таблице, разделенных запятыми.
Также нет проверки типа введенных значений, поэтому все они заканчиваются символами в новом столбце.
library(shiny)
library(reshape2)
#source('splitColumn_stack.R')
library(DT)
library(tibble)
###function for deleting the rows
splitColumn <- function(data, column_name) {
newColNames <- c("Unmerged_type1", "Unmerged_type2")
newCols <- colsplit(data[[column_name]], " ", newColNames)
after_merge <- cbind(data, newCols)
after_merge[[column_name]] <- NULL
after_merge
}
###_______________________________________________
### function for inserting a new column
fillvalues <- function(data, values, columName){
df_fill <- data
vec <- strsplit(values, ",")[[1]]
df_fill <- tibble::add_column(df_fill, newcolumn = vec, .after = columName)
df_fill
}
### use a_splitme.csv for testing this program
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
fileInput("file1", "Choose CSV File", accept = ".csv"),
checkboxInput("header", "Header", TRUE),
actionButton("Splitcolumn", "SplitColumn"),
selectInput(inputId='selectcolumn', label='select column', ''),
actionButton("deleteRows", "Delete Rows"),
textInput("textbox", label="Input the value to replace:"),
actionButton("replacevalues", label = 'Replace values')
),
mainPanel(
DTOutput("table1")
)
)
)
server <- function(session, input, output) {
rv <- reactiveValues(data = NULL)
observeEvent(input$file1, {
file <- input$file1
ext <- tools::file_ext(file$datapath)
req(file)
validate(need(ext == "csv", "Please upload a csv file"))
rv$data <- read.csv(file$datapath, header = input$header)
updateSelectInput(session, 'selectcolumn', 'select column', names(rv$data))
})
observeEvent(input$Splitcolumn, {
rv$data <- splitColumn(rv$data, input$selectcolumn)
})
observeEvent(input$deleteRows,{
if (!is.null(input$table1_rows_selected)) {
rv$data <- rv$data[-as.numeric(input$table1_rows_selected),]
}
})
output$table1 <- renderDT({
rv$data
})
observeEvent(input$replacevalues, {
rv$data <- fillvalues(rv$data, input$textbox, input$selectcolumn)
})
}
shinyApp(ui, server)