colnames 函数如何分配新的列名?

How does colnames function assign new column names?

我已经用了很多次这个功能,但现在才想到 'why does it work?'。 R 的 colnames() 函数如何为数据框分配新的列名? 我的意思是我知道 colnames(df) 如何 return 数据框的列名。但是它怎么也分配新的呢?

aa <- mtcars
colnames(aa)
colnames(aa) <- LETTERS[1:ncol(aa)]
colnames(aa)
# ^ how can colnames function either return column names or assign new ones? It's just a function.

# but we can't change the number of columns this way:
ncol(aa)
ncol(aa) <- 10

目前 colnames 函数是:

function (x, do.NULL = TRUE, prefix = "col") 
{
    if (is.data.frame(x) && do.NULL) 
        return(names(x))
    dn <- dimnames(x)
    if (!is.null(dn[[2L]])) 
        dn[[2L]]
    else {
        nc <- NCOL(x)
        if (do.NULL) 
            NULL
        else if (nc > 0L) 
            paste0(prefix, seq_len(nc))
        else character()
    }
}
<bytecode: 0x00000000091f1710>
<environment: namespace:base>

问: 我看不出这是如何为数据框分配新的列名。

<- 左侧的

colnames 与右侧的功能不同。前者称为替换函数,名称为colnames<-

显示来源

您可以在 R 控制台输入以下内容来查看其代码:

`colnames<-`

显示的来源如下所示:

`colnames<-` <- function(x, value) { ...modify x...; x }

其中第一个参数 x 是指左侧的参数,第二个参数 , value<- 的右侧。它们都是替换函数的输入,然后 R 将 运行 替换函数的结果分配回 x.

替换函数的简单示例

例如,这里有一个简单的替换函数:

# define simple replacement function
`add_n<-` <- function(x, value) x + value  

# test
my_number <- 4
add_n(my_number) <- 3
my_number
## [1] 7

更多信息

这里有一些替换函数的讨论:What are Replacement Functions in R?