我想重命名列名data.frame,
> x=data.frame(name=c("n1","n2"),sex=c("F","M"))
> colnames(x[1])="Name"
> x
name sex
1 n1 F
2 n2 M
> colnames(x)[1]="Name"
> x
Name sex
1 n1 F
2 n2 M
>
Run Code Online (Sandbox Code Playgroud)
为什么colnames(x[1]) = "Name"不工作,而colnames(x)[1]="Name"呢?
是什么原因?他们之间有什么区别?
太多的信息答案:如果你看看每个选项"脱糖"到:
# 1.
`[<-`(x, 1, value=`colnames<-`(x[1], 'Name'))
# 2.
`colnames<-`(x, `[<-`(colnames(x), 1, 'Name'))
Run Code Online (Sandbox Code Playgroud)
第一个选项仅从第一列创建一个新的data.frame,重命名该列(成功),然后尝试将该data.frame分配回第一列.[<-.data.frame将传播值,但不会根据名称重命名现有列value.
第二个选项获取data.frame的colnames,更新第一个值,并使用更新的名称创建一个新的data.frame.
(在这里回答@彭鹏的问题,因为我无法弄清楚如何在评论中起作用反引号...)
反引号是引用变量名称.考虑一下这里的区别:
x<-1
`x<-`<-1
Run Code Online (Sandbox Code Playgroud)
第一个将1分配给一个名为x的变量,但第二个分配给一个名为x的变量x<-.这些不常见的变量名实际上由<-基本函数使用 - 允许对赋值的lhs进行任意函数调用,并且<-附加到名称的函数指定如何执行更新(类似于setflisp中).