通过引用设置原子向量名称
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"
我想知道是否可以在 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"