这四种创建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关于<-
和=
在函数调用中用于变量范围时的差异,但据我所知(可能不是很远) ),这并不能解释这种特殊行为。
=
和<-
之间差异的原因是什么?=
的前缀和中缀版本之间差异的原因是什么?答案 0 :(得分:2)
当您调用函数(包括data.frame
)时,=
不会用作赋值运算符。它只是标记给定参数和传递给函数的变量之间的关系。
忽略data.frame(a = c(1,2), b = c(3,4))
,在每次调用<-
和=
之前,将其解释为正常分配,并在您的环境中创建a
和b
个变量。< / 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
处理函数的形式。 a
和c(1,2)
都传递给<-
,并返回名为a
的元素,这会导致发送到{{1}的参数中没有名称}。您可以将符号as.list
视为已经处理过,因此“已用完”。在这种情况下,默认名称是a
调用的结果。
deparse