简体   繁体   中英

Disambiguating a variable name in a function when a column with the same name as the variable exists (data.table)

I have a function with a variable named source . The function works properly, but if the data frame on which the function is applied has a column also named source , it doesn't work.

A simple example with dplyr and filtering: These two following lines works, but they filter based on the column (I want to filter on the variable name defined in the function):

corpus %>% dplyr::filter(!!source=="027021335")
corpus %>% dplyr::filter(source=="027021335")

This following line work and properly use the variable defined in the function:

corpus %>% dplyr::filter(!!rlang::sym(source)=="027021335")

How to achieve the same thing using data.table()? I have tried numerous combination of c() , get() and .. without managing to make it work. I thought that corpus[get(source)=="027021335"] should have worked but it is not the case as it returns a first argument has length > 1 error.

Edit: I think one possible reason I get this error is that in addition to source as a variable and as a column name, there is a source() function is base r.

Corpus using dput(corpus):

structure(list(idref = c("027021335", "182132870", "221468579", 
"034574654", "069546592", "159340950", "169800458", "028529413", 
"076605442", "026762889"), iddoc = c(97466L, 101100L, 103772L, 
110039L, 134077L, 55693L, 38787L, 39304L, 73483L, 74350L), nom = c("Méhaut", 
"Favre", "Guerdjikova", "Diebolt", "Giraud-Héraud", "Charlier", 
"Moumni", "Henni", "Bonnel", "Callens"), prenom = c("Philippe", 
"Karine", "Ani", "Claude", "Eric", "Christophe", "Nicolas", "Ahmed", 
"Patrick", "Stéphane"), order = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
0), role = c("supervisor", "supervisor", "supervisor", "supervisor", 
"supervisor", "supervisor", "supervisor", "supervisor", "supervisor", 
"supervisor"), Annee_soutenance = c("2011", "2014", "2018", "2009", 
"2006", "2015", "2012", "2008", "2009", "2010"), source = c("as.character(idref)", 
"as.character(idref)", "as.character(idref)", "as.character(idref)", 
"as.character(idref)", "as.character(idref)", "as.character(idref)", 
"as.character(idref)", "as.character(idref)", "as.character(idref)"
), time_variable = c("as.character(idref)", "as.character(idref)", 
"as.character(idref)", "as.character(idref)", "as.character(idref)", 
"as.character(idref)", "as.character(idref)", "as.character(idref)", 
"as.character(idref)", "as.character(idref)")), row.names = c(NA, 
-10L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x000001ee3a911ef0>)

With data.table development version (1.14.3), this can be done with the new env argument, see programming on data.table :

data.table::update.dev.pkg()
source = "idref"
corpus[source=="027021335",env=list(source=source)]

       idref iddoc    nom   prenom order       role Annee_soutenance              source       time_variable
1: 027021335 97466 Méhaut Philippe     0 supervisor             2011 as.character(idref) as.character(idref)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM