首页 > 解决方案 > get() 和 assign() 不适用于 colnames()

问题描述

我的目标是在数据框中设置列名。此数据框的名称存储在变量 name_of_table 中。

name_of_table<-"table_13"

assign(name_of_table,read.csv("table_13_air_vehicle_risks_likelihood_and_cost_effects.csv", header=FALSE))
# This works fine, like table_13 <- read.csv(...)

first_level_header <- c("one","two","three","four","five")

colnames(get(name_of_table)) <- first_level_header
# Throws error: 
#Error in colnames(get(name_of_table)) <- first_level_header : 
#  could not find function "get<-"

显然,如果我用table_13代替get(name_of_table)就可以了。如果相反,我尝试:

colnames(names(name_of_table)) <- first_level_header
#Throws error: Error in `colnames<-`(`*tmp*`, value = c("one", "two", "three", "four", : attempt to set 
#'colnames' on an object with less than two dimensions

之前有人指出我这篇文章:R using get() inside colnames

但是 eval(parse(paste0("colnames(",name_of_table,")<- first_level_header"))),除了可怕之外,也不起作用:文件中的错误(文件名,“r”):无法打开连接

我不明白涉及 SetNames 的建议。

如果 get/assign 不是正确的方法,我深表歉意,当然我想以“正确”的方式做到这一点,我感谢您的指导。

标签: r

解决方案


你可以使用library(data.table)

table_13 = data.table(1:5, 1:5, 1:5, 1:5, 1:5) 
setnames(get(name_of_table), first_level_header)  # N.B. also works for a data.frame
#    one two three four five
# 1:   1   1     1    1    1
# 2:   2   2     2    2    2
# 3:   3   3     3    3    3
# 4:   4   4     4    4    4
# 5:   5   5     5    5    5

推荐阅读