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

r:purr:paying the%。%r:walk是否通过了整个管道向量,而不是元素?

  •  1
  • andrewH  · 技术社区  · 7 年前

    这里有一个函数,可以获取文件名stem,从path、stem和suffix组合文件名,读取文件,删除变量,然后再次保存文件。在这个简化的版本中,read-stem和save-stem是相同的,我只删除了一个变量。

    library(tidyverse)
    
    strip_cps <-  function(X, path = path){
      readRDS(paste0(path = path, X, ".RDS")) %>%
        select(-"YEAR")  %>%
        saveRDS(file = paste0(path = path, X, ".RDS"))
    }
    

    这里有一个函数,可以重复调用前一个函数,每个函数干一次。

    compact_cps <- function(stems, path){
      stems %>% 
        walk(strip_cps0(., path=path))
    }
    

    这是我的数据的微观版本。用您自己系统上的目录替换数据目录

    df1 <- tibble(YEAR = 1, SEX = 1)
    df2 = df1[1,] + c(1, 1)
    
    saveRDS(df1, file = paste0("./CPS_1962-2018/", "df1", ".RDS"))
    saveRDS(df2, file = paste0("./CPS_1962-2018/", "df2", ".RDS"))
    

    在该数据上运行上述代码会导致以下错误:

    Error in gzfile(file, "rb") : invalid 'description' argument
    

    从回溯中,我了解到 gzfile 被称为 readRDS . 用重新运行代码 debug ,我了解到gzfile的描述参数是

    chr{1:2]  "./CPS_1962-2018/df1.RDS"   "./CPS_1962-2018/df1.RDS"
    

    也就是说,一个长度为2的字符向量。

    现在,在我的代码中,似乎有一个缺陷的特征,那就是我不能自己解决它们不在我认为的位置。但在我看来,在接收到字符向量之后,walk stems = c(“df1”, ”df2”) 作为其主要论点,通过 %>% 从调用函数 compact_cps ,然后将整个向量交给 strip_cps 而不是一次只处理一个元素。

    似乎我错过了什么比走路更容易,但我看不见什么。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Adam Gruer    7 年前

    试试这个

    compact_cps <- function(stems, path){
      stems %>% 
        walk(strip_cps, path=path))
    }
    
    
    

    walk的第一个参数是向量的词干,下一个参数是要为向量中的每个元素调用的函数名,然后是函数的任何其他参数。