通过引用设置原子向量名称

Set atomic vector names by reference

我想知道是否可以在 R 中通过引用设置向量名称。

我经常使用data.table::fread来读取文本文件,然后我通过包装setnames(也适用于普通data.frame)和字符串清理来清理变量名函数类似于:

clean_var_name <- function(s) {
  gsub("^_+|_+$","",gsub("(\s|\-|[[:punct:]])+", "_", tolower(s) ) )
}

所以我的函数看起来像:

clean_names <- function(x){
  require(data.table)
  if(is.data.frame(x)){setnames(x, names(x), clean_var_name(names(x)))} # this part works
  else if(is.vector(x)){ do_something_here } # this is the question
}

我想知道是否有一种方法可以通过引用执行 names(x) <- clean_var_name(names(x)) 的方式在同一函数中包含向量的情况。

v <- c(`thIs.Is.A.Terrible-Name`=1, `this One is TOO`=2)
dt <- data.table(t(v))
clean_names(dt)
dt 
#    this_is_a_terrible_name this_one_is_too
# 1:                       1               4    
# would like to be able to do same for clean_names(v)

我也愿意解释为什么这是一个坏主意(副作用、函数式编程等)

使用setattr函数:

library(data.table)
x <- 1:10
address(x)
# [1] "0x713cfd0"
setattr(x,"names",letters[1:10])
address(x)
# [1] "0x713cfd0"