代码之家  ›  专栏  ›  技术社区  ›  Jrakru56

错误:赋值的目标扩展到非语言对象

r
  •  0
  • Jrakru56  · 技术社区  · 7 年前

    我试图为大量的表动态清理一些列名,我得到了上面的错误。

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

    有什么想法吗?

    apply_alias

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

    这个 cleanup_column_names_tbl 应用 alias_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 回复  |  直到 7 年前
        1
  •  1
  •   Rui Barradas    7 年前

    不能将值赋给 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"  
    
        2
  •  0
  •   Jrakru56    7 年前

    我的解决方案:

    创造、表达和评价它。它很短,但不知何故我觉得这不是做事情的正确方式,因为我正在脱离 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"