2015-01-09 11 views
6

Đó là hợp pháp để gọi biến bằng tên bắt đầu bằng dấu chấm (như .identifier). Tuy nhiên, chức năng within() không bảo vệ chúng. Tôi đã bỏ lỡ một cái gì đó? hay nó là một con bọ nhỉ?Biến của một data.frame bắt đầu bằng một dấu chấm biến mất bên trong()

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

cho:

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-có nghĩa là-trong-r-cá nhân-ưu tiên-đặt tên-quy ước-hoặc-nhiều hơn – Khashaa

+0

Tôi đọc điều đó; nó không trả lời câu hỏi: nếu các dấu chấm được cho phép, nó phải nhất quán, ít nhất là trong 'cơ sở'! – Arthur

Trả lời

6

này có vẻ là vì tiêu chuẩn trong các phương pháp as.list cho lớp environment. Đối số chuẩn là all.names = FALSE. Từ ?as.list:

all.names một logic cho thấy dù sao chép tất cả các giá trị hoặc (mặc định) chỉ những người có tên không bắt đầu bằng một dấu chấm.

Bạn có thể thay đổi phương pháp within.data.frame như sau:

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 
} 

Sau đó, bạn nhận được hành vi dự kiến ​​của bạn:

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

Bạn có biết cách gửi chỉnh sửa không? Trong 'base' như trong' data.table' ... Giá trị tối thiểu phải là có '...' được truyền trong lệnh 'list()', do đó người ta có thể yêu cầu mang tất cả các biến theo một cách rõ ràng. – Arthur

+0

Danh sách gửi thư [email protected] là nơi để hỏi các nhà phát triển về các gói 'cơ bản'. Nếu bạn cảm thấy đây là lỗi, bạn cũng có thể báo cáo lỗi này trên https://bugs.r-project.org/bugzilla3/ – shadow

Các vấn đề liên quan