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

R: Why does data.frame only give me nice column names if I use the = 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. = 的前缀版本和中缀版本之间的区别是什么?

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

忽略 data.frame(a = c(1,2), b = c(3,4)),因为每个调用 <-= 都被解释为正常赋值,并在您的环境中创建 ab 变量.

> 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"

数据框得到期望值只是因为<-=return无形的参数。

> 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

因此您会看到结果。

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

> make.names(deparse( quote(a <- c(1,2) )) )
[1] "a....c.1..2."