2016-11-01 2 views
1

Это папки в моем каталогеИспользование lapply к источнику несколько сценариев R в поддиректории

128 128-1-32 16384 16384-1-36 4096-1  512 512-1-65 65536-1 
128-1 128tbw1 16384-1 4096  4096-1-36 512-1 65536 

Каждый из них имеет a7.R код, который загружает файлы из каждой папки и создает images.I хочу, чтобы мой сценарий вводить каждый из папок, то

source('a7.R') 

затем закройте эту папку и повторите процедуру для всех folders.I делает это сейчас вручную, и это действительно boring.Is это возможно с R?

Я попробовал решение, как этот

#!/usr/bin/Rscript 

lapply(list.files(full.names=TRUE, recursive = TRUE, pattern = "^a7\\.R$"), source) 

[email protected]:~/jbirp/mt07$ Rscript s.R 
list() 

-ного раствора coffeinejunky «s не работает

#!/usr/bin/Rscript 

foo <- function(directory) { setwd(directory); source(a7.R) } 
do.call("foo", list(directory= 128 128-1-32 16384 16384-1-36 4096-1 512 512-1-65 65536-1 128-1 128tbw1 16384-1 4096 4096-1-36 512-1 65536)) 

    source('n.R') 
Error in source("n.R") : n.R:2:33: unexpected numeric constant 
1: foo <- function(directory) { setwd(directory); source(a7.R) } 
2: do.call("foo", c(directory= 128 128 

Если я изменить список, как этот

do.call("foo", list(directory= "./128" "./128-1" "./128-1-32" "./128tbw1" "./16384" "./16384-1" "./16384-1-36" "./4096" "./4096-1" "./4096-1-36" "./512" "./512-1" "./512-1-65" "./65536" "./65536-1")) 

Я получил

Error in source("n.R") : n.R:2:40: unexpected string constant 
1: foo <- function(directory) { setwd(directory); source(a7.R) } 
2: do.call("foo", list(directory= "./128" "./128-1" 

         ^

Это то, что я получил, когда я перечисляю тракту

> list.dirs(path = ".", full.names = TRUE) 
[1] "."   "./128"  "./128-1"  "./128-1-32" "./128tbw1" 
[6] "./16384"  "./16384-1" "./16384-1-36" "./4096"  "./4096-1"  
[11] "./4096-1-36" "./512"  "./512-1"  "./512-1-65" "./65536"  
[16] "./65536-1" 

мне нужно изменить каталог несколько раз и выполняют ту же операцию в каждом из them.Is lapply хорошо для этого или нет?

+1

Что-то вроде 'для (MYDIR в dirVec) источника (паста (MYDIR, "a7.R", сентябрь = "/")) 'должен делать трюк. – lmo

+3

Попробуйте 'lapply (list.files (recursive = TRUE, pattern ="^a7 \\. R $ "), source)' –

+0

Каждая папка имеет файл a7.R, этот скрипт делает что-то конкретное только для этой папки или это тот же скрипт, но с разными данными, т. е. форматы входных файлов одинаковы во всех этих папках? – zx8754

ответ

2

Следующая должно работать:

directories <- list.dirs(path=".", full.names = T) 
# you need to make sure this contains the relevant directories 
# otherwise you need to remove irrelevant directories 

foo <- function(x) { 
    old <- setwd(x) # this stores the old directory and changes into the new one 
    source("a7.R") 
    setwd(old) 
} 

lapply(directories, foo) 

В качестве альтернативы,

for(folder in directories) foo(folder) 
Смежные вопросы