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 关于 <-
和 =
在函数调用中使用变量范围时的区别,但据我所知(可能不是很远),这并不能解释这种特殊行为。
=
和 <-
之间的区别是什么?
=
的前缀版本和中缀版本之间的区别是什么?
调用函数时,包括data.frame
,=
不作为赋值运算符使用。它只是标记给定参数和您传递给函数的变量之间的关系。
忽略 data.frame(a = c(1,2), b = c(3,4))
,因为每个调用 <-
和 =
都被解释为正常赋值,并在您的环境中创建 a
和 b
变量.
> 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
处理。 a
和 c(1,2)
都传递给了 <-
并返回了一个名为 a
的元素,这导致发送给 [=12= 的参数中没有名称].您可以将符号 a
视为已经处理过,因此 "used up"。这种情况下的默认名称是 deparse
调用的结果。
> make.names(deparse( quote(a <- c(1,2) )) )
[1] "a....c.1..2."
这四种创建 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 关于 <-
和 =
在函数调用中使用变量范围时的区别,但据我所知(可能不是很远),这并不能解释这种特殊行为。
=
和<-
之间的区别是什么?=
的前缀版本和中缀版本之间的区别是什么?
调用函数时,包括data.frame
,=
不作为赋值运算符使用。它只是标记给定参数和您传递给函数的变量之间的关系。
忽略 data.frame(a = c(1,2), b = c(3,4))
,因为每个调用 <-
和 =
都被解释为正常赋值,并在您的环境中创建 a
和 b
变量.
> 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
处理。 a
和 c(1,2)
都传递给了 <-
并返回了一个名为 a
的元素,这导致发送给 [=12= 的参数中没有名称].您可以将符号 a
视为已经处理过,因此 "used up"。这种情况下的默认名称是 deparse
调用的结果。
> make.names(deparse( quote(a <- c(1,2) )) )
[1] "a....c.1..2."