[英]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."
我已经阅读了在变量范围方面在函数调用中使用<-
和=
之间的区别,但是据我所能推断(可能不是很远),这并不能解释这种特殊行为。
=
和<-
之间的差异? =
的前缀版本和中缀版本之间的差异? 当您调用包括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"
数据框仅由于<-
和=
隐式返回参数而获得期望值。
> 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
的元素,这导致发送给as.list
的参数中没有名称。 您可以将符号a
视为已经被处理,因此已用完。 在这种情况下,默认名称是调用deparse
的结果。
> make.names(deparse( quote(a <- c(1,2) )) )
[1] "a....c.1..2."
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.