R:如果我使用=运算符,为什么data.frame只给我很好的列名?

时间:2015-08-19 19:56:06

标签: r dataframe assignment-operator

这四种创建dataframe外观的方式与我很相似:

myData1 <- data.frame(a <- c(1,2), b <- c(3, 4))
myData2 <- data.frame(a = c(1,2), b = c(3,4))
myData3 <- data.frame(`<-`(a,c(1,2)), `<-`(b,c(3, 4)))
myData4 <- data.frame(`=`(a,c(1,2)), `=`(b,c(3,4)))

但是如果我打印出列名,我只会得到我希望使用=运算符的好列名。在所有其他情况下,整个表达式成为列名,所有非字母数字都被句点替换:

> colnames(myData1)
[1] "a....c.1..2." "b....c.3..4."
> colnames(myData2)
[1] "a" "b"
> colnames(myData3)
[1] "a....c.1..2." "b....c.3..4."
> colnames(myData4)
[1] "a...c.1..2." "b...c.3..4."

read关于<-=在函数调用中用于变量范围时的差异,但据我所知(可能不是很远) ),这并不能解释这种特殊行为。

  1. 考虑=<-之间差异的原因是什么?
  2. 考虑=的前缀和中缀版本之间差异的原因是什么?

2 个答案:

答案 0 :(得分:2)

当您调用函数(包括data.frame)时,=不会用作赋值运算符。它只是标记给定参数和传递给函数的变量之间的关系。

忽略data.frame(a = c(1,2), b = c(3,4)),在每次调用<-=之前,将其解释为正常分配,并在您的环境中创建ab个变量。< / p>

> ls()
character(0)
> myData1 <- data.frame(a <- c(1,2), b <- c(3, 4))
[1] "a"       "b"       "myData1"
> rm(list=ls())
> ls()
character(0)
> myData3 <- data.frame(`<-`(a,c(1,2)), `<-`(b,c(3, 4)))
> ls()
[1] "a"       "b"       "myData3"
> rm(list=ls())
> ls()
character(0)
> myData4 <- data.frame(`=`(a,c(1,2)), `=`(b,c(3,4)))
> ls()
[1] "a"       "b"       "myData4"

数据框仅获得预期值,因为<-=无形地返回参数。

> foo <- `=`(a,c(1,2))
> foo
[1] 1 2

因为您的data.frame调用是等效的,忽略变量赋值副作用,

> data.frame(c(1,2), c(3, 4))
  c.1..2. c.3..4.
1       1       3
2       2       4

因此你看到的结果。

答案 1 :(得分:2)

当您提供a <- c(1,2)作为data.frame的参数时,第一个参数将有一个值,但在formals列表中将没有名称。使用as.list处理函数的形式。 ac(1,2)都传递给<-,并返回名为a的元素,这会导致发送到{{1}的参数中没有名称}。您可以将符号as.list视为已经处理过,因此“已用完”。在这种情况下,默认名称是a调用的结果。

deparse