2014-11-05 3 views
0

간단한 5 라인 명령을 실행하려고하는데 9000 개가 넘는 다른 파일을 실행하려고합니다. 나는 루프를 위해 다음을 썼다.R 루프 열기 파일

setwd("/Users/morandin/Desktop/Test") 
output_file<- ("output_file.txt") 
files <- list.files("/Users/morandin/Desktop/Test") 
for(i in files) { 
    chem.w.in <- scan(i, sep=",") 
    pruned.tree<-drop.tip(mytree,which(chem.w.in %in% NA)) 
    plot(pruned.tree) 
    pruned.tree.ja.chem.w.in <- phylo4d(pruned.tree, c(na.omit(chem.w.in))) 
    plot(pruned.tree.ja.chem.w.in) 
    out <- abouheif.moran(pruned.tree.ja.chem.w.in) 
    print(out) 
} 

안녕하세요, 제 질문을 편집하고 있습니다. 위의 코드는 for 루프를 완벽하게 처리합니다 (모든 도움을 주셔서 감사합니다). 나는 결과물에 여전히 문제가있다.

나는 bash 명령을 통해 R을 사용하여 전체 출력을 리디렉션 할 수 있지만 처리 된 파일의 이름이 필요합니다. 내 결과물은 다음과 같습니다.

class: krandtest 
Monte-Carlo tests 
Call: as.krandtest(sim = matrix(res$result, ncol = nvar, byrow = TRUE), 
    obs = res$obs, alter = alter, names = test.names) 

Number of tests: 1 

Adjustment method for multiple comparisons: none 
Permutation number: 999 
    Test  Obs Std.Obs Alter Pvalue 
1 dt 0.1458514 0.7976225 greater 0.2 

other elements: adj.method call 

Pvalue 결과와 파일 이름 (요소 i)을 인쇄하는 방법이 있습니까 ??

덕분에

+0

파일 이름과 파일 확장자 사이에'.'가 필요하지 않습니까? '파일 '은 어떻게 생겼습니까? 그것을'paste (i, "txt", sep = ".")'로 변경해보십시오. 그러나'list.files'에서 나온 확장자가 이미 있어야합니다. –

+0

'read.table (i)'를 루프 – Koundy

+0

@koundy는 현재 작업 디렉토리가'/ Users/morandin/Desktop/Test'라고 가정합니다. 기본적으로'list.files()'는 전체 경로를 반환하지 않습니다. –

답변

2

Paul Hiemstra's answer은 # 1로 대답 했으므로 # 2에 대한 답변입니다. "답변"은 "abouheif.moran(pruned.tree.ja.chem.w.in)의 인쇄 된 출력"을 의미합니다.

append = true과 함께 cat()을 사용하십시오. 이 파일의 모양 my_output_file.txt라고 생산할 예정이다

output_file = "my_output_file.txt" 
for(i in files) { 
    # do stuff 
    # make plots 
    out <- abouheif.moran(pruned.tree.ja.chem.w.in) 
    out <- sprintf("-------\n %s:\n-------\n%s\n\n", i, out) 
    cat(out, file = output_file, append = TRUE) 
} 

: 예를 들어

------- 
file_1: 
------- 
output_goes_here 

------- 
file_2: 
------- 
output_goes_here 

분명히 포맷 전적으로 여러분에게 달려; 나는 여기서 할 수있는 일을 보여주고 싶었다.

다른 해결책은 전체 스크립트 sink()이지만, 나는 그것에 대해 분명하게 명시하고 싶습니다. 중간 도로는 sink() 코드의 작은 부분 일 수도 있지만 극단적 인 경우를 제외하면 선호 또는 스타일의 문제입니다.

+1

데이터에서 허용하는 경우 루프의 결과를'data.frame'에 넣고'write.table '을 사용하여 저장하는 것이 가장 좋은 방법이라고 생각합니다. 이렇게하면 나중에 R 또는 다른 도구로 쉽게 읽을 수 있습니다. –

+0

고마워, 나는 실제로 Pvalue 만 얻고 어떻게 든 관리하는 sprintf 함수를 변형 시켰습니다! – user3188922

+0

@ user3188922이 경우에는 이식성을 위해'write.table' 접근법을 사용하는 것이 좋습니다. – shadowtalker

2

내가 잘못 여기에가는 것은 기본적으로 list.files()는 파일, 파일에 전체가 아닌 경로의 이름 만 목록을 반환하는 것이 무엇인지 생각한다. full.namesTRUE으로 설정하면이 문제가 해결됩니다. list.files()은 이미 기존 파일의 전체 경로를 반환하기 때문에 txt에 파일 이름을 추가 할 필요가 없습니다.

+1

완벽을 기원합니다 :'(파일 ("rt"파일 (file)에 오류가 있습니다 : 연결을 열 수 없습니다)''파일을 찾을 수 없음 '을 말하는 것은보기 흉한 방법입니다. – shadowtalker