如何访问指定子文件夹中的文件而不更改工作目录在R?

时间:2014-06-23 02:43:25

标签: r csv

在R中,我想访问子文件夹中的某个文件。但我不想改变工作目录然后再​​回来。它浪费了很多时间。

例如,我在/home/phuong文件夹上工作。 这是phuong的树形结构。

phuong-> data1, data2, data3.
data1-> abc.csv, def.csv, script1.R
data2-> bond.csv, option.csv, pricing.R
data3->.....

所以我想在abc.csv,def.csv中加载数据并在pricing.R中运行代码。

因此,如果使用代码setwd,它会让我失去很多时间,看起来代码很愚蠢,就像这样:

setwd("/home/phuong/data1" );

read.csv("abc.csv");
read.csv("def.csv");
setwd("/home/phuong/data2" );
source("pricing.R")

我丢失了很多次从文件夹移动到另一个文件夹,但所有文件夹都位于同一文件夹home/phuong/中。 所以我需要一些方法来访问子文件夹中没有setwd命令的任何文件。 请帮帮我,

5 个答案:

答案 0 :(得分:33)

假设您的工作目录为/home/hermie并且您想要从当前WD下方的目录中加载.csv文件(让我们说/home/hermie/data),您只需执行此操作这样:

setwd('/home/hermie')
myData <- read.csv('./data/myCsvFile.csv')

当然你也可以向上导航&#34;向上&#34;在目录树中。我们假设您要在Bob的主目录(/home/bob)中加载文件。你可以这样做:

setwd('/home/hermie')
data_from_bob <- read.csv('../bob/otherDataFile.csv') # Of course, this will work
                                                      # only if you can read
                                                      # files from that directory

希望这有帮助。


<强> 更新

不知何故,我认为你希望有人为你编写解决方案......我建议:

> setwd('/home/phuong')
> data_abc <- read.csv('./data1/abc.csv')
> data_def <- read.csv('./data1/def.csv')
> source('./data2/pricing.R')

真的这样难以写这个吗?如果你在每一步都改变你的WD,你将不得不写更多。

而且,关于我对符号链接的消解,在你的bash终端上,你可以这样做:

$ cd /home/phuong
$ ln -s ./data1/abc.csv data1_abc.csv
$ ln -s ./data1/def.csv data1_def.csv
$ ln -s ./data2/pricing.R pricing.R

然后,从R:

> setwd('/home/phuong')
> data_abc <- read.csv('data_abc.csv')
> data_def <- read.csv('data_def.csv')
> source('pricing.R')

答案 1 :(得分:13)

如果我了解你之后的情况,你可以使用Hadley在Advanced R中称之为闭包的内容:

## Make a function that takes a path and another function
## and returns that same function with the path pre-progammed in
pathit <- function(FUN, path){
    function(file, ...){
        FUN(file=file.path(path, file), ...)
    }
}

## generate new functions that have the path pre-programmed in
read.csv2b <- pathit(read.csv, "home/phuong/data1")
source2 <- pathit(source, "home/phuong/data2")


read.csv2b("abc.csv")
read.csv2b("def.csv")
source2("pricing.R")

如果您有很多东西需要阅读,这可能是值得的,否则为什么不提供实际功能的整个路径?如果这对我来说仍然是一个有趣的学习经历之后的事情: - )

答案 2 :(得分:0)

对我而言,学习导航文件夹的最直观方法是使用list.files("../")。您将看到需要从当前位置导航的上游还是下游:)

答案 3 :(得分:0)

我不知道这是否是您要寻找的东西,但是我在特定的github文件夹中有一个文件库,当我在新分支中初始化项目时,该文件库就是我提供的,并且我在网上找到了这样的解决方案:

setwd("~/repos/library/all_the_things")
library_files <- list.files()
sapply(library_files, source)

太好了,除了现在我要在目录中启动我不想保存绘图等的所有文件,所以我意识到所需要做的只是这个:

library_files <- list.files("~/repos/library/all_the_things", full.name=T)
sapply(library_files, source)

现在,它无需更改目录即可运行它们。

答案 4 :(得分:0)

我刚刚发现了 here 包。我将它用于我正在处理的 project。与目前提到的其他选项相比,它提供了一种更简洁的引用嵌套文件夹的方法。举个例子:

install.packages('here')
library('here')
here::i_am("pricing.R")
read.csv(here("data1/abc.csv"));
read.csv(here("data1/def.csv"));