这不是严格意义上的问题,而是我偶然遇到的问题。但是,这对我来说真的很有趣。
我在我的控制台中运行以下行
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
的内容。
我将不胜感激。
答案 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_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
位于您的全球环境中,因为{ {1}}运营商。