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

Jam*_*e H 17 csv r

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

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

phuong-> data1, data2, data3.
data1-> abc.csv, def.csv, script1.R
data2-> bond.csv, option.csv, pricing.R
data3->.....
Run Code Online (Sandbox Code Playgroud)

所以我想在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")
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*nka 37

假设您的工作目录是,/home/hermie并且您想要.csv从当前WD下面的目录中加载文件(比方说/home/hermie/data),您可以这样做:

setwd('/home/hermie')
myData <- read.csv('./data/myCsvFile.csv')
Run Code Online (Sandbox Code Playgroud)

当然,您也可以在目录树中"向上"导航.假设你想在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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


更新

不知怎的,我想你想让别人为你编写解决方案...我建议:

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

难道真的这么难治写?如果你在每一步都改变你的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
Run Code Online (Sandbox Code Playgroud)

然后,来自R:

> setwd('/home/phuong')
> data_abc <- read.csv('data_abc.csv')
> data_def <- read.csv('data_def.csv')
> source('pricing.R')
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ker 15

如果我理解你所追求的是什么,你可以使用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")
Run Code Online (Sandbox Code Playgroud)

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