data.frame定义中的赋值

时间:2018-01-16 11:36:42

标签: r parsing assignment-operator

这不是严格意义上的问题,而是我偶然遇到的问题。但是,这对我来说真的很有趣。

我在我的控制台中运行以下行

sc_matrix <- data.frame(sc_start<-rpois(n=15, 0.4), sc_end<-rpois(n=15, 0.3))

我真的很惊讶输出是

head(sc_matrix, n=5)
#   sc_start....rpois.n...15..0.4. sc_end....rpois.n...15..0.3.
#1                               0                            1
#2                               0                            2
#3                               0                            0
#4                               1                            1
#5                               0                            0

首先,我很惊讶因为翻译了解我(甚至没有警告)。即使我在data.frame构造函数中使用了<-赋值,也创建了data.frame

其次,colnames似乎是根据规则创建的,将所有非字母数字更改为.(点)并将其用作名称。

在阅读assignments comparison的讨论后,我想我的问题是:

R如何处理该行代码?由于没有=运算符,因此它会评估每个参数,例如: sc_start<-rpois(n=15, 0.4),从中创建列名并使用右侧评估的值?

这似乎很棘手,因为运算符<-没有返回任何值,我猜想创建的data.frame应该包含类似NULL的内容。 我将不胜感激。

2 个答案:

答案 0 :(得分:4)

sc_matrix <- data.frame(sc_start<-rpois(n=15, 0.4), sc_end<-rpois(n=15, 0.3))

要理解这里发生的事情,您需要知道R中的几乎所有内容(数据对象除外)<-实际上都是一个函数。你甚至可以做`<-`(a, 1)之类的事情。这个函数有一个不可见的返回值,它是赋值的RHS(见help("<-")),即你的假设是错误的。

如果您未将列名称传递给data.frame(作为=的LHS),则使用substitute创建名称。如果check.names = TRUE是默认值,则会对这些名称进行清理。您观察到的内容与您执行data.frame(1)之类的内容基本相同。

答案 1 :(得分:2)

在您的示例中,通过

sc_start <- rpois(n=15, 0.4) 

您实际上将rpois(n=15, 0.4)的结果分配给变量sc_start。同样适用于sc_end <- rpois(n=15, 0.3)

创建数据框后,您会注意到这些变量已创建并放置在您的全局环境中。

你所做的与

基本相同
data.frame(rpois(n=15, 0.4), rpois(n=15, 0.3))

其中未明确指定列名称,因此除非fix.empty.names设置为FALSE,否则R会自动创建它们。唯一的区别是您将每列的结果保存在变量中。也就是sc_startsc_end

检查

的结果
data.frame(x = sc_start <- rpois(n=15, 0.4), y = sc_end <- rpois(n=15, 0.3))

您会注意到由于x运算符导致列名称为y=sc_startsc_end位于您的全球环境中,因为{ {1}}运营商。