2

这与R 中的赋值运算符有关: '=' 和 '<-';但是,那里没有回答我的问题。

链接的问题和答案解释了 using <-inside of a function 声明了用户工作区中的变量赋值,以便在调用函数后可以使用该变量。(编者注:链接的答案中实际上并未说明,如果已说明,那将是错误的。如果您就参数列表的评估发表了声明,并将其限制为从全局环境中调用此类函数,则可能是正确的。)

这似乎可以解释以下行为差异。以下代码data frame完全符合预期:

A <- data.frame(
  Sub = rep(c(1:3),each=3),
  Word = rep(c('Hap','Lap','Sap'),3),
  Vowel_Length = sample(c(1:100),9)
  )

结果是:

  Sub Word Vowel_Length
1   1  Hap           31
2   1  Lap            2
3   1  Sap           71
4   2  Hap           58
5   2  Lap           28
6   2  Sap           20
7   3  Hap           78
8   3  Lap           72
9   3  Sap           77

但是,如果我们<-在函数内部使用data.frame(),如下所示,我们会​​得到不同的结果。

B <- data.frame(
  Sub <- rep(c(1:3),each=3),
  Word <- rep(c('Hap','Lap','Sap'),3),
  Vowel_Length <- sample(c(1:100),9)
  )

这个结果是:

  Sub....rep.c.1.3...each...3. Word....rep.c..Hap....Lap....Sap....3.
1                            1                                    Hap
2                            1                                    Lap
3                            1                                    Sap
4                            2                                    Hap
5                            2                                    Lap
6                            2                                    Sap
7                            3                                    Hap
8                            3                                    Lap
9                            3                                    Sap
  Vowel_Length....sample.c.1.100...9.
1                                  31
2                                  15
3                                   4
4                                   2
5                                  89
6                                  55
7                                  12
8                                  72
9                                  47

我假设,因为<-在函数内部使用全局声明变量,然后data frame从该全局声明继承的标头,正如链接的问题和答案似乎表明的那样。[见评论。]

但是,我很好奇为什么你会得到,例如,Sub....rep.c.1.3...each...3.作为第一列的标题data frame而不是Sub <- rep(c(1:3),each=3),,甚至是代替1 1 1 2 2 2 3 3 3

更新:

正如@AnandaMahto 在已删除的评论中指出的那样,设置check.namesFALSE会产生以下行为。

C <- data.frame(
  Sub <- rep(c(1:3),each=3),
  Word <- rep(c('Hap','Lap','Sap'),3),
  Vowel_Length <- sample(c(1:100),9),
  check.names=FALSE
)

结果在哪里:

  Sub <- rep(c(1:3), each = 3) Word <- rep(c("Hap", "Lap", "Sap"), 3)
1                            1                                    Hap
2                            1                                    Lap
3                            1                                    Sap
4                            2                                    Hap
5                            2                                    Lap
6                            2                                    Sap
7                            3                                    Hap
8                            3                                    Lap
9                            3                                    Sap
  Vowel_Length <- sample(c(1:100), 9)
1                                  15
2                                   3
3                                  82
4                                  33
5                                  99
6                                  53
7                                  89
8                                  77
9                                  47

为了澄清,我的问题只是为什么会发生这种行为。特别是,为什么你会得到Sub....rep.c.1.3...each...3.一个标题而Sub <- rep(c(1:3),each=3),不是.1 1 1 2 2 2 3 3 3check.names=TRUE

现在,我想我也很好奇你为什么会得到Sub <- rep(c(1:3),each=3),标题check.names=FALSE

4

3 回答 3

4

您的问题似乎是关于 R 最终使用的奇怪命名,您想知道为什么它没有空格、< 等。

如果这是您的实际问题,您应该查看check.names.data.frame

来自?data.frame

check.names 合乎逻辑。如果TRUE然后检查数据框中的变量名称,以确保它们是语法上有效的变量名称并且不重复。如有必要,它们会被调整(按make.names),这样它们就可以了。

因此,您可以通过设置check.namesFALSE

B <- data.frame( Sub <- rep(c(1:3),each=3), 
                 Word <- rep(c('Hap','Lap','Sap'),3), 
                 Vowel_Length <- sample(c(1:100),9),
                 check.names = FALSE)
B
#   Sub <- rep(c(1:3), each = 3) Word <- rep(c("Hap", "Lap", "Sap"), 3)
# 1                            1                                    Hap
# 2                            1                                    Lap
# 3                            1                                    Sap
# 4                            2                                    Hap
# 5                            2                                    Lap
# 6                            2                                    Sap
# 7                            3                                    Hap
# 8                            3                                    Lap
# 9                            3                                    Sap
#   Vowel_Length <- sample(c(1:100), 9)
# 1                                  33
# 2                                  20
# 3                                   5
# 4                                  83
# 5                                  99
# 6                                  79
# 7                                  58
# 8                                  46
# 9                                  44
于 2013-09-04T18:48:03.213 回答
3

在第一种情况下,您有一个命名列表,而在第二种情况下,您有一个未命名的列表。这是一个说明性示例:

f = function(...) {
  l = list(...)
  print(names(l))
}

f(a = 4, b = 5)
#[1] "a" "b"

f(a <- 4, b <- 5)
#NULL

从那时起,如果列表未命名,则data.frame根据设置的内容制定命名策略check.names

于 2013-09-04T18:58:10.960 回答
0

正如其他答案所指出的那样,您应该阅读做什么check.names

但是,您也可能会考虑这一点:如果您编写data.frame( Sub = rep(c(1:3)) )等号意味着“绑定一个名为”的命名参数Sub。该命名参数保留在调用的内部data.frame()

如果你写data.frame( Sub <- rep(c(1:3)) )这个<-标志意味着“分配到本地环境”。Sub因此,除了创建 data.frame 之外,您还创建了一个名为的变量。在调用的生命周期之后,该Sub变量仍然存在于您的环境中。data.frame()

于 2015-04-21T09:45:01.547 回答