使用 rhandsontable R 包对单元格进行数值验证
Numerical validation of a cell using rhandsontable R package
我想在更新基于 "rhandsontable" 的 table 时创建验证方案。我有两列:Min 和 Max,我希望当 Max 列中的单元格更新时,只允许使用大于同一行中前一列 Min 的值进行更新,反之亦然。也许可以使用 hot_cols 渲染器并通过大于零的减法等方式进行验证,但我一般不熟悉 "rhandsontable" 或 "hansontable" 虽然我认为这是可能的,但是我不知道怎么办。谢谢。
玩具示例:
library(shiny)
library(rhandsontable)
if (interactive()) {
ui <- fluidPage(
rHandsontableOutput('table'),
tableOutput('table1')
)
server <- function(input, output,session) {
values <- reactiveValues(df=data.frame(Parameter=c('A','B','C'),Min=c(10,20,30),Max=c(20,30,40)))
observe({
if(!is.null(input$table)){
values$df <- hot_to_r(input$table)
output$table1<-renderTable(values$df)
}
})
output$table<-renderRHandsontable({
rhandsontable(values$df)%>%
hot_col("Parameter", readOnly = TRUE)%>%
hot_validate_numeric(col='Min', min = 1, max = 50,allowInvalid = FALSE)%>%
hot_validate_numeric(col='Max', min = 1, max = 50,allowInvalid = FALSE)
})
}
shinyApp(ui, server)
}
这就是我在评论中所指的内容。您可能会觉得它很复杂,但这就是 server side
质量控制在 rhandsontable
中的样子。
在这个阶段,您可以自由地想出您需要的最复杂的函数。
作为一种更复杂(但可能更有效)的方法来执行此操作,您可以使用不同的合并语句,这些语句可以像 SQL
join 一样工作,或者使用 dplyr
或 data.table
non -equi 或主要/次要连接。
library(shiny)
library(rhandsontable)
ui <- fluidPage(column(6,
rHandsontableOutput('table')),
column(6, tableOutput('table1'))
)
server <- function(input, output,session) {
df <- eventReactive( input$table, {
if (is.null(input$table)) {
dfOld <<- df <- data.frame(Parameter=c('A','B','C'),Min=c(10,20,30),Max=c(20,30,40))
} else {
df <- hot_to_r(input$table)
# Quality control
# Rule 1:
if( any(df$Max > 9) & any(df$Min < 3) ) {
df$Max <- dfOld$Max
df$Min <- dfOld$Min
} }
dfOld <<- df
df
}, ignoreNULL = F)
output$table<-renderRHandsontable({
if (is.null(df())) return()
rhandsontable(df())%>%
hot_col("Parameter", readOnly = TRUE)%>%
hot_validate_numeric(col='Min', min = 1, max = 50,allowInvalid = FALSE)%>%
hot_validate_numeric(col='Max', min = 1, max = 50,allowInvalid = FALSE)
})
}
shinyApp(ui, server)
如果有用请告诉我。
我想在更新基于 "rhandsontable" 的 table 时创建验证方案。我有两列:Min 和 Max,我希望当 Max 列中的单元格更新时,只允许使用大于同一行中前一列 Min 的值进行更新,反之亦然。也许可以使用 hot_cols 渲染器并通过大于零的减法等方式进行验证,但我一般不熟悉 "rhandsontable" 或 "hansontable" 虽然我认为这是可能的,但是我不知道怎么办。谢谢。
玩具示例:
library(shiny)
library(rhandsontable)
if (interactive()) {
ui <- fluidPage(
rHandsontableOutput('table'),
tableOutput('table1')
)
server <- function(input, output,session) {
values <- reactiveValues(df=data.frame(Parameter=c('A','B','C'),Min=c(10,20,30),Max=c(20,30,40)))
observe({
if(!is.null(input$table)){
values$df <- hot_to_r(input$table)
output$table1<-renderTable(values$df)
}
})
output$table<-renderRHandsontable({
rhandsontable(values$df)%>%
hot_col("Parameter", readOnly = TRUE)%>%
hot_validate_numeric(col='Min', min = 1, max = 50,allowInvalid = FALSE)%>%
hot_validate_numeric(col='Max', min = 1, max = 50,allowInvalid = FALSE)
})
}
shinyApp(ui, server)
}
这就是我在评论中所指的内容。您可能会觉得它很复杂,但这就是 server side
质量控制在 rhandsontable
中的样子。
在这个阶段,您可以自由地想出您需要的最复杂的函数。
作为一种更复杂(但可能更有效)的方法来执行此操作,您可以使用不同的合并语句,这些语句可以像 SQL
join 一样工作,或者使用 dplyr
或 data.table
non -equi 或主要/次要连接。
library(shiny)
library(rhandsontable)
ui <- fluidPage(column(6,
rHandsontableOutput('table')),
column(6, tableOutput('table1'))
)
server <- function(input, output,session) {
df <- eventReactive( input$table, {
if (is.null(input$table)) {
dfOld <<- df <- data.frame(Parameter=c('A','B','C'),Min=c(10,20,30),Max=c(20,30,40))
} else {
df <- hot_to_r(input$table)
# Quality control
# Rule 1:
if( any(df$Max > 9) & any(df$Min < 3) ) {
df$Max <- dfOld$Max
df$Min <- dfOld$Min
} }
dfOld <<- df
df
}, ignoreNULL = F)
output$table<-renderRHandsontable({
if (is.null(df())) return()
rhandsontable(df())%>%
hot_col("Parameter", readOnly = TRUE)%>%
hot_validate_numeric(col='Min', min = 1, max = 50,allowInvalid = FALSE)%>%
hot_validate_numeric(col='Max', min = 1, max = 50,allowInvalid = FALSE)
})
}
shinyApp(ui, server)
如果有用请告诉我。