繁体   English   中英

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

我已经阅读了在变量范围方面在函数调用中使用<-=之间的区别,但是据我所能推断(可能不是很远),这并不能解释这种特殊行为。

  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"

数据框仅由于<-=隐式返回参数而获得期望值。

> 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的元素,这导致发送给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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM