我有一个简单的 Shiny 应用程序,如果应用程序的用户在修改rhandsontable时在“项目名称”列中输入太多字符,我想阻止应用程序的用户保存和导出数据。我找到了一种方法将字母变成红色,以警告您输入了太多字符,但我正在努力寻找一种真正阻止用户保存数据的方法。这是我这样做的尝试,但我无法弄清楚。一如既往,任何帮助将不胜感激。
library(shiny)
library(rhandsontable)
library(tibble)
project_data <- tibble(
"Project Name" = c("Project A", "Project B", "Project C"),
"Project Cost" = c(10000, 15000, 20000),
"Project Status" = c("In Progress", "Completed", "In Progress"),
"Project Start Date" = as.Date(c("2023-01-15", "2022-05-10", "2023-03-20"))
)
modified_data <- reactiveVal(project_data)
ui <- fluidPage(
titlePanel("Project Data"),
fluidRow(
column(12,
rHandsontableOutput("table")
)
),
fluidRow(
column(12,
actionButton("saveButton", "Save")
)
)
)
server <- function(input, output, session) {
modified_data <- reactiveVal(project_data)
output$table <- renderRHandsontable({
rhandsontable(modified_data()) %>%
hot_col("Project Name", allowInvalid = FALSE, renderer = "
function(instance, td, row, col, prop, value, cellProperties) {
Handsontable.renderers.TextRenderer.apply(this, arguments);
if (value.length > 20) {
td.style.color = 'red';
}
}
")
})
observeEvent(input$saveButton, {
invalid_values <- modified_data()$`Project Name`[nchar(modified_data()$`Project Name`) > 20]
if (length(invalid_values) == 0) {
saved_data <- hot_to_r(input$table)
write.csv(saved_data, file = "saved_project_data.csv", row.names = FALSE)
showModal(
modalDialog(
title = "Success",
"Data has been saved to 'saved_project_data.csv'.",
easyClose = TRUE
)
)
} else {
showModal(
modalDialog(
title = "Warning",
"DATA HAS NOT BEEN SAVED",
easyClose = TRUE
)
)
}
})
}
shinyApp(ui, server)
最佳答案
这里您需要一个验证器
。假设您希望允许用户在 project name
列中仅输入最大长度为 10 的字符串,则以下内容将阻止将较长的字符值保存到单元格中,并在出现以下情况时打印错误消息:用户尝试执行此操作。
validator = "
function (value, callback) {
setTimeout(function(){
callback(value.length < 11);
if (value.length > 10) {
alert('more than 10 characters!');
}
}, 1000)
}
"
library(shiny)
library(rhandsontable)
library(tibble)
project_data <- tibble(
"Project Name" = c("Project_A", "Project_B", "Project_C"),
"Allowed" = c("yes", "no", "")
)
modified_data <- reactiveVal(project_data)
ui <- fluidPage(titlePanel("Project Data"),
fluidRow(column(12,
rHandsontableOutput("table"))),
fluidRow(column(12,
actionButton(
"saveButton", "Save"
))))
server <- function(input, output, session) {
modified_data <- reactiveVal(project_data)
output$table <- renderRHandsontable({
rhandsontable(modified_data()) %>%
hot_col(
"Project Name",
allowInvalid = FALSE,
validator = "
function (value, callback) {
setTimeout(function(){
callback(value.length < 11);
if (value.length > 10) {
alert('more than 10 characters!');
}
}, 1000)
}
"
)
})
observeEvent(input$saveButton, {
invalid_values <-
modified_data()$`Project Name`[nchar(modified_data()$`Project Name`) > 20]
if (length(invalid_values) == 0) {
saved_data <- hot_to_r(input$table)
write.csv(saved_data,
file = "saved_project_data.csv",
row.names = FALSE)
showModal(
modalDialog(
title = "Success",
"Data has been saved to 'saved_project_data.csv'.",
easyClose = TRUE
)
)
} else {
showModal(modalDialog(
title = "Warning",
"DATA HAS NOT BEEN SAVED",
easyClose = TRUE
))
}
})
}
shinyApp(ui, server)
关于r - 有没有办法在 R Shiny 中强制限制 rhandsontable 的字符数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77203327/