2015-01-09 12 views
6

È legale chiamare una variabile con un nome che inizia con un punto (come .identifier). Tuttavia, la funzione within() non li conserva. Ho dimenticato qualcosa? o è un bug?Le variabili di un data.frame che iniziano con un punto scompaiono all'interno di()

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

dà:

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 
+0

http://stackoverflow.com/questions/7526467/what- do-the-dot-mean-in-r-personal-preference-naming-convention-or-more – Khashaa

+0

Ho letto che; non risponde alla domanda: se i punti sono autorizzati, dovrebbe essere coerente, almeno in 'base'! – Arthur

risposta

6

Questo sembra essere causa di serie nel metodo as.list per la classe environment. L'argomento standard è all.names = FALSE. Da ?as.list:

all.names una logica che indica se copiare tutti i valori o (default) solo coloro i cui nomi non iniziano con un punto.

È possibile cambiare il metodo di within.data.frame al seguente:

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 
} 

Quindi si ottiene il vostro comportamento previsto:

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 
+0

Sai come inviare una correzione? In 'base' come in' data.table' ... Il minimo dovrebbe essere avere '...' passato nella chiamata 'list()', in modo che si possa chiedere esplicitamente di portare tutte le variabili lungo. – Arthur

+0

La mailing list [email protected] è il posto dove chiedere agli sviluppatori i pacchetti 'base'. Se ritieni che questo sia un bug, puoi segnalarlo anche su https://bugs.r-project.org/bugzilla3/ – shadow

Problemi correlati