data.frame 定义中的赋值

Assignment in definition of data.frame

这个严格来说不是问题,而是我偶然遇到的事情。然而,这对我来说真的很有趣。

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

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),从中创建列名并使用右侧评估的值?

这看起来很棘手,因为运算符 <- 没有 return 任何值,我猜创建的 data.frame 应该包含类似 NULL 的内容。 我将不胜感激对此的任何评论。

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

要了解此处发生的情况,您需要知道 R 中的几乎所有内容(数据对象除外)<- 实际上都是一个函数。您甚至可以执行 `<-`(a, 1) 之类的操作。这个函数有一个不可见的 return 值,它是赋值的 RHS(参见 help("<-")),即你的假设是错误的。

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

之类的操作基本相同

在你的例子中,

sc_start <- rpois(n=15, 0.4) 

你实际上把rpois(n=15, 0.4)的结果赋给了变量sc_startsc_end <- rpois(n=15, 0.3) 也是如此。

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

你做的和

基本一样
data.frame(rpois(n=15, 0.4), rpois(n=15, 0.3))

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

查看

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

您会注意到列名是 xy 由于 = 运算符和 sc_startsc_end 在您的全局环境中由于到 <- 运算符。