用以点开头的名称调用变量是合法的(如.identifier)。但是,within()函数并不保留它们。我错过了什么吗?还是一只虫子?
A <- data.frame(.has.a.dot=1:10,has.no.dot=letters[1:10])
within(A, new.variable<-rnorm(10,.has.a.dot))给予:
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发布于 2015-01-09 17:14:06
这似乎是因为as.list方法中用于类environment的标准。标准参数是all.names = FALSE。来自?as.list
all.names是一种逻辑,指示是复制所有值,还是(默认)只复制名称不以点开头的值。
可以将within.data.frame方法更改为:
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
}然后你就得到了你期望的行为:
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 10https://stackoverflow.com/questions/27865025
复制相似问题