Опция поиска данных R не поддерживает экзотическое кодирование (latin1) - PullRequest
5 голосов
/ 08 апреля 2019

Я пытался разработать веб-приложение R Shiny, используя DT для отображения данных. Мне нужно использовать входные данные, чтобы заполнить опцию поиска по данным, поскольку я фильтрую и упорядочиваю возможные условия поиска по term-freq. Мои данные на французском, поэтому они содержат акценты с кодировкой latin1 (я пробовал кодировку UTF8, но рендеринг становится грязным).

Я сравнил поведение renderDataTable в вычислениях на стороне сервера и на стороне клиента. Клиентская сторона работает хорошо, но данные должны обрабатываться таким образом. Серверная часть не находит соответствия для акцентированных терминов (французские акценты).

Вот этот репекс

library(shiny)
library(DT)
data=data.frame(index=1:6,nom=c("hého","bonjour","enchanté","merci","où ça ?","à qui s'adresse-t-il ?"),stringsAsFactors = F)

ui <- fluidPage(
  title = 'Use the DT package in shiny',
  selectizeInput(inputId = 'tag',label="mots pour filtrer",
                 choices=strsplit(data$nom,split = " ")%>%unlist%>%unique),  
  h3('A Table Using Client-side Processing'),
  fluidRow(
    DT::dataTableOutput('tbl_a')
  ),
  h3('A Table Using Server-side Processing'),
  fluidRow(
    DT::dataTableOutput('tbl_b')
  )
)
server <- function(input, output, session) {
  output$tbl_a = DT::renderDataTable(datatable(data,options=list(search=list(search=input$tag))), server = FALSE)
  output$tbl_b = DT::renderDataTable(datatable(data,options=list(search=list(search=input$tag))))
}


shinyApp(ui,server)

Обработка на стороне клиента возвращает желаемый результат ... Но я бы хотел добиться этого с помощью обработки на стороне сервера.

Вот результат вызова xfun::session_info('DT')

R version 3.5.3 (2019-03-11)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17134), RStudio 1.2.1330

Locale:
  LC_COLLATE=French_France.1252 
  LC_CTYPE=French_France.1252   
  LC_MONETARY=French_France.1252
  LC_NUMERIC=C                  
  LC_TIME=French_France.1252    

Package version:
  assertthat_0.2.1  
  BH_1.69.0.1       
  cli_1.1.0         
  colorspace_1.4.1  
  crayon_1.3.4      
  crosstalk_1.0.0   
  digest_0.6.18     
  DT_0.5            
  fansi_0.4.0       
  ggplot2_3.1.0     
  glue_1.3.1        
  graphics_3.5.3    
  grDevices_3.5.3   
  grid_3.5.3        
  gtable_0.3.0      
  htmltools_0.3.6   
  htmlwidgets_1.3   
  httpuv_1.5.0      
  jsonlite_1.6      
  labeling_0.3      
  later_0.8.0       
  lattice_0.20.38   
  lazyeval_0.2.2    
  magrittr_1.5      
  MASS_7.3.51.1     
  Matrix_1.2.15     
  methods_3.5.3     
  mgcv_1.8.27       
  mime_0.6          
  munsell_0.5.0     
  nlme_3.1.137      
  pillar_1.3.1      
  pkgconfig_2.0.2   
  plyr_1.8.4        
  promises_1.0.1    
  R6_2.4.0          
  RColorBrewer_1.1.2
  Rcpp_1.0.1        
  reshape2_1.4.3    
  rlang_0.3.2       
  scales_1.0.0      
  shiny_1.2.0       
  sourcetools_0.1.7 
  splines_3.5.3     
  stats_3.5.3       
  stringi_1.4.3     
  stringr_1.4.0     
  tibble_2.1.1      
  tools_3.5.3       
  utf8_1.1.4        
  utils_3.5.3       
  viridisLite_0.3.0 
  withr_2.1.2       
  xtable_1.8.3      
  yaml_2.2.0     

1 Ответ

5 голосов
/ 23 апреля 2019

Применение iconv(to="UTF-8") к input$tag исправляет это!

Выезд на третий стол tbl_c.

xfun::session_info('DT')
library(shiny)
library(DT)
data=data.frame(index=1:6,nom=c("hého","bonjour","enchanté","merci","où ça ?","à qui s'adresse-t-il ?"),stringsAsFactors = F)

ui <- fluidPage(
  title = 'Use the DT package in shiny',
  selectizeInput(inputId = 'tag',label="mots pour filtrer",
                 choices=strsplit(data$nom,split = " ")%>%unlist%>%unique),  
  h3('A Table Using Client-side Processing'),
  fluidRow(
    DT::dataTableOutput('tbl_a')
  ),
  h3('A Table Using Server-side Processing'),
  fluidRow(
    DT::dataTableOutput('tbl_b')
  ),
  h3('A Table Using Server-side Processing'),
  fluidRow(
    DT::dataTableOutput('tbl_c')
  )
)
server <- function(input, output, session) {
  output$tbl_a = DT::renderDataTable(datatable(data,options=list(search=list(search=input$tag))), server = FALSE)
  output$tbl_b = DT::renderDataTable(datatable(data,options=list(search=list(search=enc2native(input$tag),regex=T))))
  output$tbl_c = DT::renderDataTable(datatable(data,options=list(search=list(search=iconv(input$tag,to = "UTF-8"),regex=T))))
}


shinyApp(ui,server)
...