【问题标题】:Assignment in definition of data.framedata.frame 定义中的赋值
【发布时间】:2018-06-25 02:37:19
【问题描述】:

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

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

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 构造函数中使用了&lt;- 赋值,也创建了data.frame

其次,colnames 似乎是按照规则创建的,将所有非字母数字变为.(dot) 并将其用作名称。

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

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

这似乎很棘手,因为运算符&lt;- 不返回任何值,我猜创建的data.frame 应该包含类似NULL 的内容。 我将不胜感激任何关于此的cmets。

【问题讨论】:

  • colnames中的点很可能是make.names()生成的,纪录片中说:A syntactically valid name consists of letters, numbers and the dot or underline characters [..] All invalid characters are translated to ".".

标签: r parsing assignment-operator


【解决方案1】:
sc_matrix <- data.frame(sc_start<-rpois(n=15, 0.4), sc_end<-rpois(n=15, 0.3))

要了解这里发生了什么,您需要知道就像 R 中的几乎所有内容(数据对象除外)&lt;- 实际上是一个函数。您甚至可以执行`&lt;-`(a, 1) 之类的操作。这个函数有一个不可见的返回值,它是赋值的 RHS(见help("&lt;-")),也就是说,你的假设是错误的。

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

【讨论】:

    【解决方案2】:

    在您的示例中,由

    sc_start <- rpois(n=15, 0.4) 
    

    您实际上将rpois(n=15, 0.4) 的结果分配给变量sc_startsc_end &lt;- 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))
    

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

    【讨论】:

    • 我已将@Roland 标记为答案,但您的评论也很有见地,谢谢!
    猜你喜欢
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多