2015-01-09 7 views
6

Es ist zulässig, eine Variable mit einem Namen aufzurufen, der mit einem Punkt beginnt (wie .identifier). Die Funktion within() bewahrt sie jedoch nicht. Habe ich etwas verpasst? Oder ist es ein Fehler?Variablen eines data.frames, die mit einem Punkt beginnen, verschwinden innerhalb von()

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

gibt:

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- does-the-dot-mean-in-r-persönliche-Präferenz-Benennung-Konvention-oder-mehr – Khashaa

+0

Ich lese das; es beantwortet nicht die Frage: Wenn Punkte erlaubt sind, sollte es konsistent sein, zumindest in "Basis"! – Arthur

Antwort

6

Diese environment wegen Standard im as.list Methode für die Klasse zu sein scheint. Das Standardargument lautet all.names = FALSE. Von ?as.list:

eine logische all.names angibt, ob alle Werte oder (default) zu kopieren, nur die, deren Namen nicht mit einem Punkt beginnen.

können Sie die within.data.frame Methode ändern, um die folgenden:

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 
} 

Dann Sie Ihre erwartete Verhalten erhalten:

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

Wissen Sie, wie Sie eine Korrektur einreichen? In 'base' wie in' data.table' ... Das Minimum sollte sein, dass '...' im 'list()' Aufruf übergeben wird, so dass explizit nach dem Tragen aller Variablen gefragt werden kann. – Arthur

+0

Die Mailing-Liste [email protected] ist der Ort, an dem die Entwickler nach "base" -Paketen gefragt werden. Wenn Sie glauben, dass dies ein Fehler ist, können Sie dies auch auf https://bugs.r-project.org/bugzilla3/ melden. – shadow