Data.frame variables starting with a dot disappear inside ()

The right to name a variable with a name starting with a .identifier (for example, .identifier ). However, within() does not save them. Did I miss something? Or is this a mistake?

 A <- data.frame(.has.a.dot=1:10,has.no.dot=letters[1:10]) within(A, new.variable<-rnorm(10,.has.a.dot)) 

gives:

  has.no.dot new.variable 1 a 1.300361 2 b 3.014026 3 c 2.354260 4 d 4.261637 5 e 5.159326 6 f 7.178712 7 g 6.438039 8 h 8.253819 9 i 9.463351 10 j 8.828403 
+6
source share
1 answer

This is similar to the standard in the as.list method for the environment class. The standard argument is all.names = FALSE . From ?as.list :

all.names - a logical indication whether to copy all values ​​or (by default) only those whose names do not start with a period.

You can change the within.data.frame method to the following:

 within.data.frame <- function (data, expr, ...) { parent <- parent.frame() e <- evalq(environment(), data, parent) eval(substitute(expr), e) # l <- as.list(e) # removed this line l <- as.list(e, all.names=TRUE) # added this line l <- l[!sapply(l, is.null)] nD <- length(del <- setdiff(names(data), (nl <- names(l)))) data[nl] <- l if (nD) data[del] <- if (nD == 1) NULL else vector("list", nD) data } 

Then you get the expected behavior:

 within(A, new <- .has.a.dot) ## .has.a.dot has.no.dot new ## 1 1 a 1 ## 2 2 b 2 ## 3 3 c 3 ## 4 4 d 4 ## 5 5 e 5 ## 6 6 f 6 ## 7 7 g 7 ## 8 8 h 8 ## 9 9 i 9 ## 10 10 j 10 
+6
source

Source: https://habr.com/ru/post/980775/


All Articles