在dplyr管道操作中将here()函数与map()集成

时间:2018-08-03 21:29:07

标签: r

我最近阅读了this帖子,建议不要在脚本中使用setwd(),而推荐使用here()函数。原因很合理,我想使用它,但是我遇到了一些麻烦。具体来说,我有一个函数,可以使用dplyr管道中的map函数读取大量.csv文件。它的工作原理如下:

setwd('directory with files')

files = dir(pattern = '*.csv')
df = files %>%
  map(read.csv)

这将创建目录中所有文件的列表,然后可以根据需要使用该文件。不幸的是,由于here()实际上并没有更改目录,它只是暂时指向目录,因此read.csv函数看不到文件。我当前使用的解决方法是:

##no use of setwd() or 'files = '
df = paste(file.path(here('directory with files')), '/', 
           dir(here('directory with files'), pattern = '*.csv', sep = '') %>%
  map(read.csv)

这可行,但是它笨拙,我觉得应该有一个更优雅的解决方案,但我不知道这是什么。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以在full.names = TRUE中使用dir()来获取完整的文件路径,而不是通过粘贴来创建文件路径:

dir(here("directory with files"), pattern = '*.csv', full.names = TRUE) %>%
    map(read.csv)

此外,如果我要在整个脚本中多次引用目录,我有时会分配一个用于读取/写入的名称,而不是每次都写出here()代码。

basedir = here("directory with files")
dir(basedir, pattern = '*.txt', full.names = TRUE)