此提示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
)
)
}
答案 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 )