错误:分配目标扩展为非语言对象

时间:2019-01-04 16:57:48

标签: r

我试图动态清除大量表的某些列名,但出现上述错误。

我有种直觉,我应该使用quo,但是我不知道该怎么做。

有什么想法吗?

apply_alias应用了一组业务规则来清理名称。

apply_alias <-  function(l){
  which(l=="Geography")
  l[which(l=="Geography")]  <- "GEO"

  toupper(l)
}

cleanup_column_names_tblalias_function应用于表列表

cleanup_column_names_tbl <- function(PID){
  for(p in PID){
    names(get(paste0("tbl_",p))) <- apply_alias(names(get(paste0("tbl_",p))))
  }
}

cleanup_column_names_tbl("14100287")

当我尝试运行它时,出现以下错误消息:

> cleanup_column_names_tbl("14100287")
Error in names(get(paste0("tbl_", p))) <- apply_alias(names(get(paste0("tbl_",  : 
  target of assignment expands to non-language object

样本数据:

> dput(tbl_14100287[1,])
structure(list(V1 = 0L, REF_DATE = "1976-01", GEO = "Canada", 
    DGUID = "2016A000011124", `Labour force characteristics` = "Population", 
    Sex = "Both sexes", `Age group` = "15 years and over", Statistics = "Estimate", 
    `Data type` = "Seasonally adjusted", UOM = "Persons", UOM_ID = 249L, 
    SCALAR_FACTOR = "thousands", SCALAR_ID = 3L, VECTOR = "v2062809", 
    COORDINATE = "1.1.1.1.1.1", VALUE = 16852.4, STATUS = "", 
    SYMBOL = NA, TERMINATED = NA, DECIMALS = 1L), class = c("data.table", 
"data.frame"), row.names = c(NA, -1L), .internal.selfref = <pointer: 0x000002123cf21ef0>)

2 个答案:

答案 0 :(得分:0)

由于没有功能get,因此无法为get<-分配值。正确的方法如下所示。

apply_alias <-  function(l){
  l[which(l == "Geography")]  <- "GEO"
  toupper(l)
}

cleanup_column_names_tbl <- function(PID, envir = .GlobalEnv){
  pid_full <- paste0("tbl_", PID)
  res <- lapply(pid_full, function(p){
    nms <- apply_alias(names(get(p)))
    DF <- get(p)
    names(DF) <- nms
    DF
  })
  names(res) <- pid_full
  list2env(res, envir = envir)
  invisible(NULL)
}


cleanup_column_names_tbl("14100287")

names(tbl_14100287)
# [1] "V1"                           "REF_DATE"                    
# [3] "GEO"                          "DGUID"                       
# [5] "LABOUR FORCE CHARACTERISTICS" "SEX"                         
# [7] "AGE GROUP"                    "STATISTICS"                  
# [9] "DATA TYPE"                    "UOM"                         
#[11] "UOM_ID"                       "SCALAR_FACTOR"               
#[13] "SCALAR_ID"                    "VECTOR"                      
#[15] "COORDINATE"                   "VALUE"                       
#[17] "STATUS"                       "SYMBOL"                      
#[19] "TERMINATED"                   "DECIMALS"  

答案 1 :(得分:0)

我的解决方案:

创建和表达并评估它。这很短,但是由于我脱离了R的功能范式,所以某种程度上感觉它不是做事的正确方法。

cleanup_column_names_tbl <- function(PID){
  for(p in PID){
    expr1 <- paste0("names(", paste0("tbl_",p), ") <- apply_alias(names(", paste0("tbl_",p),"))")
    eval(rlang::parse_expr(expr1))
    }
}

编辑:

一种稍微不同的方式:

  • 避免使用字符串
  • 更加灵活,因为它允许使用字符串和符号
library(rlang)
test_df <- data.frame(a=1:10,b=1:10)
test_df2 <- data.frame(a=1:10,b=1:10)


fix_names <-  function(df){

  x <- ensym(df)
  expr1 <- expr(names(!!x) <- toupper(names(!!x)))
  eval(expr1, envir = parent.env(environment()))
  # expr1
}

fix_names(test_df)
fix_names("test_df2")

names(test_df)
#> [1] "A" "B"
names(test_df2)
#> [1] "A" "B"