2010-01-13 2 views
0

R 스크립트의 명령과 결과를 텍스트 보고서 파일에 기록하려고합니다. 텍스트 파일에 파이프가 sink()과 잘 작동하지만 for 루프 내에서는 작동하지 않습니다.파이프 R 명령과 for 루프 내에서의 결과 파일

스크립트는 우리가 연속적으로 벡터에 data.frame의 모든 행을 추출하고 각 벡터에 일부 벡터 기반 분석을 수행하는 루프를 필요

source("myscript.r",echo=TRUE) 

호출합니다. txtStart()는 명령이 아니라 결과를 반복하는 것,

#pipe output to file 
sink("myfile.txt",append=TRUE,split=TRUE) 
#some data 
c1<-rnorm(10,mean=90,sd=10) 
c2<-rnorm(10,mean=75,sd=8) 
c3<-rnorm(10,mean=98,sd=12) 
#data in a data.frame 
cData<-data.frame(c1,c2,c3) 
#print data.frame 
cData 
#loop over frame 
for (i in 1:ncol(cData)) 
{ 
    #extract vector 
    x<-cData[,i] 
    #do something with vector 
    n = length(x) 
    #... more code 
    #print result 
    print(n)  
} 
#close output 
sink() 

내가 sink()txtStart()하지만 sink()와 그것을 시도는 명령을 자르고 루프 후 결과를두고 : 다음은 간단한 예입니다.

필자도 BREW를 보았지만 텍스트 파일 만 있으면 포맷이 필요하지 않습니다.

답변

0

몇 가지 생각 : 루프가 R이 표현이 완료 될 때까지 R이 루프를 실행하지 않기 때문에 이것이 출력 –를 제공하기위한 표준 방법입니다 후

결과는 오는. sink과 관련된 문제는 아닙니다. 이것을 확인하려면 sink 명령을 제외한 모든 코드 스 니펫을 실행하십시오 (결과가 R 콘솔로 이동하므로 동일한 효과가 나타납니다). 명확함을 위해 for 루프 시작 부분에

cat("Results for iteration", i, "\n") 

과 같은 행을 추가 할 수 있습니다.주바 지적


, 당신은이 인스턴스 – vectorisation 중 하나에 for 루프를 필요로하지 않는 것 또는 apply 더 좋을 것입니다.


R에서 보고서의 형태로 코드와 출력을 결합의 표준 방법은 Sweave을 사용하는 것입니다. 이렇게하면 라텍스 마크 업이 생성되어 PDF 또는 포스트 스크립트 문서로 컴파일 할 수 있습니다 (라텍스 도구를 설정 한 후 약간의 노력으로). 이것의 분명한 이점은 수치를 포함시킬 수 있다는 것입니다.


EDIT : 혼합 텍스트 및 코드 보고서의 경우 brew package도 있습니다.

+0

잘라 내기가 R의 표준이며 용지를 저장하지만 보고서에 전체 소스 코드가 필요하다는 것에 동의합니다. 말하자면, R 코드는 벡터화 될 수 있지만 알고리즘은 물질 테스트 표준에서 나온 것이며 for-loop에서 구현 될 때 보고서 판독기에 대해 더 쉽게 이해할 수 있습니다. 마지막으로 Sweave를 시도했습니다. 상상했던 것보다 훨씬 잘 작동하고 LaTeX-Output은 멋지게 보입니다. – Michael

0

정확히 무엇을 원하는지, 특히 텍스트 파일에 소스 코드를 넣으려는 이유를 정확히 알지 못합니다.

먼저, for 루프, 특히 lapply 및 sapply 대신 데이터 프레임을 찾아보기 위해 * 적용 패밀리를 사용하는 것이 좋습니다.

다음 코드를 사용하면 출력에 대해 세 가지 다른 프리젠 테이션을 얻을 수 있습니다. 첫 번째 코드는 코드와 유사해야합니다. 두 번째와 세 번째는 조금 다르며 값을 목록 또는 데이터 프레임으로 출력합니다.

sink("/tmp/myfile.txt", append=TRUE, split=TRUE) 

myfunc <- function(v) { 
    variance <- var(v) 
    mean <- mean(v) 
    return(list(variance=variance,mean=mean)) 
} 

myotherfunc <- function(v) { 
    cat("And the mean is:\n") 
    print(mean(v)) 
    cat("And the variance is:\n") 
    print(var(v)) 
} 

# results printed directly 
invisible(lapply(cData, myotherfunc)) 

# results as a list 
lapply(cData, myfunc) 

# results as a data frame 
sapply(cData, myfunc) 


sink() 

어쨌든 이러한 출력 중 하나가 원하는 것일 수 있습니다.

+0

내가 필요한 것은 인쇄하여 문서에 첨부 할 수있는 텍스트 보고서입니다. 이 보고서에는 결과를 수동으로 확인할 수 있도록 데이터 프레임, 소스 코드 및 결과가 포함되어야합니다. lapply (cData, myfunc)는 작동하지만 myfunc에/if에 대한 내부 코드의 인쇄물이 잘린 경우 (예 : > myfunc <- function (v) { ) + N <- 길이 (V) +의 경우 (N> 5) + { + 분산 <- VAR (V) + 의미 <- 평균 (V) + 창 (리스트 (분산 = 분산, 평균 = 평균)) + .... [TRUNCATED] # 결과가 목록으로 표시 > lapply (cData, myfunc) $ c1 ... 도움 주셔서 감사합니다. – Michael

2

나는

source("myscript.r",echo=TRUE) 

의 관점에서가 아니라

Rscript myscript.r  # on windows, linux or os x 

을 (R와 함께 제공) Rscript의 관점에서 또는 littler

r myscript.r   # on linux or os x 
의 관점에서 생각하지 않는 것이 좋습니다

이렇게하면 명령 행 매개 변수를 조회 할 수 있습니다 (CRAN 패키지 getopt를 통해) 및 optparse) 및 훨씬 더.