我正在开发一个闪亮的应用程序,它有一个反应性df,我正在使用它来渲染dt数据表。我的问题是,在我的侧边栏pickerInput过滤器上,我正在使用:
choices = unique(COLUMN_NAME)
当列中有CCD_ 2值变为"0"时;NA";在过滤器上,所以当我使用时:
filter(COLUMN_NAME %in% input$column_name)
在反应性df中,NA值没有正确过滤。最好的办法是什么?我应该将任何NA值重新编码为字符串,还是应该修复侧边栏过滤器,使NA过滤为真正的NA值?
我认为最好将NA
作为特例,即将其视为缺失值,而不是character
。这是因为在R中(你在R中计算(NA
是一个公认的对象,所以当把它作为NA
(缺失值(留在数据帧中时,你可能会获得很多优势(比如速度(。
但这是真的,JavaScript没有NA
这样的构造,所以我们最终得到了字符类型:
jsonlite::toJSON(c(1, NA, 2))
#> [1,"NA",2]
假设:
- 您正在使用data.frame(您想要过滤data.frame(,并且您使用
dplyr::filter
(非常重要,因为在默认情况下,如果您按已知值进行过滤,则会删除丢失的值,这与c(1, NA)[c(1, NA) == 1]
中不同,在CCD_10中将保留NA值(
你可以试试这样的东西:
library(shiny)
library(dplyr)
is_val <- function(value, set) {
if (all(value == "NA")) {
is.na(set)
} else {
if (any(value == "NA")) {
set %in% value | is.na(set)
} else {
set %in% value
}
}
}
choices <- data.frame(col = c(1, NA, 2, 1, 3, 1, 2))
ui <- fluidPage(
selectInput("column_name", "Choose", choices = unique(choices$col), multiple = TRUE),
tableOutput("display_val")
)
server <- function(input, output, session) {
output$display_val <- renderTable({
req(input$column_name)
choices |>
filter(is_val(input$column_name, col))
})
}
shinyApp(ui, server)
关键当然是函数is_val
;是否由用户拾取。如果pickerInput
没有multiple = TRUE
,这个代码可能会简单一点。