r - 有没有办法在 R Shiny 中强制限制 rhandsontable 的字符数?

标签 r shiny rhandsontable

我有一个简单的 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)
            }
            "

enter image description here

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/

相关文章:

javascript - Rhandsontable 条件格式 - 如何根据特定属性值突出显示行?

r - 如何将一元数据转换为二元(关系)数据

根据服务器中的条件逻辑呈现 Shiny 的用户输入

shiny - 如何使用 Shiny 的 updateSelectinput 不选择任何项目?

r - 如何将响应式(Reactive)rhandsontable重置为默认值?

R Shiny 模块不会在同一事件中进行 react 性更新

r - 为什么 h2o 包中的交叉验证数据有不同的 MSE

r - 不带逗号跳过行

performance - 为什么 `colMeans()` 和 `rowMeans()` 函数比使用带有 `lapply()` 的均值函数更快?

r - 直接动态添加框到 Shiny Dashboard