dplyr-mutate:转义的列在DT中为false:已编辑数据表标题;是(dplyr-mutate:使用动态变量名...(用于DT :: datatable`))

时间:2019-07-20 10:24:24

标签: r shiny dplyr dt

此提示dplyr - mutate: use dynamic variable names, answer of @Tom Roth效果很好,但是我有一个小问题。

[edit:似乎不是动态变量引起的。重新添加了/ edit]

如果我将初始列myCol更改为url(例如),并使用新名称将旧列myColInitialValue复制到数据帧df的末尾,则我以为which(colnames(df)=='myCol')会发回myColInitialValue的列号,但这在DT :: datatable()中似乎是个问题

我的目标是使用escape的{​​{1}}参数。我用DT::datatable()来等待。使用常量,它也行不通,但是DT package似乎也会出现错误的#列。 :)

这是我的问题专栏文章的转义来源:

  • #列正确
  • 当我调试时,我得到一个数据框,其列顺序不正确 但是我没有再得到,我没有再生产它。
  • 但是即使escape=FALSE的数字正确,闪亮/数据表中显示的转义列也是错误的
which()

在我的函数中,使用了{Tom Roth}关于output$Myoutputdatatable <- DT::renderDataTable( { mydatatable<-Myreactivefunction() mydatatable<- ( mydatatable %>% ungroup() %>% get_url_pdf(.,nom_colonne_initiale_pour_url = "s_code", nom_colonne_code_rempl="s_code_old", repertoire_cible = my_path_of_pdf, nom_colonne_test_fichier="s_exists") %>% get_url_pdf(.,nom_colonne_initiale_pour_url = "sp_code", nom_colonne_code_rempl="sp_code_old", repertoire_cible = my_path_of_pdf, nom_colonne_test_fichier="sp_exists") ) escape_vector<-which(colnames(mydatatable) %in% list("s_code","sp_code")) res<-DT::datatable( mydatatable, style = "bootstrap", class = "compact", filter='top', selection = c("single"), escape=escape_vector, options = list( deferRender = TRUE, bSortClasses = TRUE,iDisplayLength = 20, width = "100%", scrollX=TRUE , lengthMenu = list(c(5, 25, 50, 75, 100, -1), list('5', '25','50','75','100', 'All')), search = list( smart = TRUE, regex = TRUE, caseInsensitive = TRUE ) ) ); res <- ( res %>% formatStyle( columns = c("s_code_old"), valueColumns = c("s_code_old"), target='row', color = styleEqual(c('__UNKNOWN__'), c("red")) ) ) res } ) 中动态变量的答案。

mutate()

编辑:添加了PRPREX

get_url_pdf <-function (mydatatable,nom_colonne_initiale_pour_url, nom_colonne_code_rempl, 
                        repertoire_cible,nom_colonne_test_fichier = "" ) {

  # exemple mutate(iris [1:3,], !!("varcible") :=  UQ(rlang::sym("Species") ))


  (mydatatable
   %>% ungroup()
   %>% mutate (
     nom_colonne_test_fichier=nom_colonne_test_fichier,
     varsource =  !!(rlang::sym(nom_colonne_initiale_pour_url) ),
     nom_fichier_pdf=paste0(gsub("\\.", "_",  varsource),'.pdf'),
     var_nom_colonne_test_fichier=ifelse(nom_colonne_test_fichier=='',"",UQ(rlang::sym(nom_colonne_test_fichier))),
     fichier_pdf_existe=ifelse(var_nom_colonne_test_fichier=="",file_test("-f", paste0(repertoire_cible , nom_fichier_pdf)),var_nom_colonne_test_fichier),     
     varcible =  ifelse(fichier_pdf_existe,paste0('<a class="url_pdf" href="http://',hostipserver ,hostportserver,'/rapportpdfpath/',nom_fichier_pdf,'"  target = "_blank">',varsource,'</a>'), varsource)  ,    
     !!(nom_colonne_initiale_pour_url) :=varcible  , 
     !!(nom_colonne_code_rempl) :=varsource         
   )
  )

}

1 个答案:

答案 0 :(得分:2)

作为rstudio/DT#691中的答案,由于将行名视为一列,因此您应该在列位置添加另外的1L。此外,由于真正的目的是对某些列进行转义,因此所提供的向量上应该有一个负号。

简而言之

escape_vector <- which(colnames(mydatatable) %in% list("toto_1","toto_2")) 

应更改为

escape_vector <- -( which(colnames(mydatatable) %in% c("toto_1","toto_2")) + 1L )