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_start
。 sc_end <- rpois(n=15, 0.3)
也是如此。
创建数据框后,您会注意到这些变量已创建并放置在您的全局环境中。
你做的和
基本一样
data.frame(rpois(n=15, 0.4), rpois(n=15, 0.3))
其中列名未明确指定,因此 R 会自动创建它们,除非 fix.empty.names
设置为 FALSE
。唯一的区别是您将每一列的结果保存在一个变量中。即 sc_start
和 sc_end
.
查看
的结果
data.frame(x = sc_start <- rpois(n=15, 0.4), y = sc_end <- rpois(n=15, 0.3))
您会注意到列名是 x
和 y
由于 =
运算符和 sc_start
和 sc_end
在您的全局环境中由于到 <-
运算符。
这个严格来说不是问题,而是我偶然遇到的事情。然而,这对我来说真的很有趣。
我 运行 我的控制台中有以下行
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_start
。 sc_end <- rpois(n=15, 0.3)
也是如此。
创建数据框后,您会注意到这些变量已创建并放置在您的全局环境中。
你做的和
基本一样data.frame(rpois(n=15, 0.4), rpois(n=15, 0.3))
其中列名未明确指定,因此 R 会自动创建它们,除非 fix.empty.names
设置为 FALSE
。唯一的区别是您将每一列的结果保存在一个变量中。即 sc_start
和 sc_end
.
查看
的结果data.frame(x = sc_start <- rpois(n=15, 0.4), y = sc_end <- rpois(n=15, 0.3))
您会注意到列名是 x
和 y
由于 =
运算符和 sc_start
和 sc_end
在您的全局环境中由于到 <-
运算符。