首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以点开头的data.frame变量消失在()中。

以点开头的data.frame变量消失在()中。
EN

Stack Overflow用户
提问于 2015-01-09 16:32:18
回答 1查看 106关注 0票数 7

用以点开头的名称调用变量是合法的(如.identifier)。但是,within()函数并不保留它们。我错过了什么吗?还是一只虫子?

代码语言:javascript
运行
复制
A <- data.frame(.has.a.dot=1:10,has.no.dot=letters[1:10])
within(A, new.variable<-rnorm(10,.has.a.dot))

给予:

代码语言:javascript
运行
复制
   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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-09 17:14:06

这似乎是因为as.list方法中用于类environment的标准。标准参数是all.names = FALSE。来自?as.list

all.names是一种逻辑,指示是复制所有值,还是(默认)只复制名称不以点开头的值。

可以将within.data.frame方法更改为:

代码语言:javascript
运行
复制
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
}

然后你就得到了你期望的行为:

代码语言:javascript
运行
复制
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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27865025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档