2017-05-23 3 views
3

R에서 루프를 벗어나려고하지만 sapply 함수의 진행 과정에 대한 정보를 반환하는 방법을 찾는 데 문제가 있습니다. 내가 루프를 사용하여 벡터를 처리하고 내가 처리하고 무엇을 행 인쇄하려는 경우 예를 들어, 나는 쓰기 :sapply를 사용하여 행 번호를 반환하는 중

vec = c(1:10) 
out = NULL 
for (i in 1:length(vec)){ 
    print(paste("Processing item ",i,sep="")) 
    y = vec[i]^2 
    out = c(out,y) 
} 

가 어떻게 sapply과 같은 일을 할 수 있습니까? 여기 내가 가진 코드가있다.

func = function(x) { 
    #print (paste("Processing item ",x,sep="")) ## This is where I want to print out the row number being processed. 
    x^2 
} 

out = sapply(vec,func) 

감사합니다.

+0

아마'사용을 sprintf' 이런' ? – Jaap

+0

'sprintf'는 내가하고 싶은 것을 할 수 있습니다. 결과를 벡터로 출력하고 화면으로 출력하는 코드를 수정했습니다. 'sprintf ('처리중인 항목 % s, 값 : % s', 1 : 길이 (vec), out = sapply (vec, func))'. 이것이 klugey인지 아닌지는 잘 모르겠지만, 저에게는 효과적입니다. 감사. 답변에 댓글을 추가하면 그것을 선택합니다. – user44796

+0

완료. 'funx' 만'x^2'을하면,'sprintf' 내부의 sapply 호출은 필요 없습니다. – Jaap

답변

1

당신은 방금 sprintf α- 함수와 함께이 작업을 수행 할 수 있습니다 :주는

sprintf('Processing item %s, value: %s', 1:length(vec), vec^2) 

:

[1] "Processing item 1, value: 1" 
[2] "Processing item 2, value: 4" 
[3] "Processing item 3, value: 9" 
[4] "Processing item 4, value: 16" 
[5] "Processing item 5, value: 25" 
[6] "Processing item 6, value: 36" 
[7] "Processing item 7, value: 49" 
[8] "Processing item 8, value: 64" 
[9] "Processing item 9, value: 81" 
[10] "Processing item 10, value: 100" 

또 다른 옵션은 조금 다르게 함수를 정의하는 것입니다 :

func <- function(x) { 
    p <- paste0("Processing item ", 1:length(x)) 
    y <- x^2 
    cbind.data.frame(p, y) 
} 

요 U 지금은 dataframe 반환 func(vec)을 사용`의 sprintf ("처리 항목 %의 s의 값 : %의 S '1 길이 (VEC) VEC^2)

    p y 
1 Processing item 1 1 
2 Processing item 2 4 
3 Processing item 3 9 
4 Processing item 4 16 
5 Processing item 5 25 
6 Processing item 6 36 
7 Processing item 7 49 
8 Processing item 8 64 
9 Processing item 9 81 
10 Processing item 10 100 
2

대신 인덱스를 처리하고 함수의 값에 액세스 할 수 있습니다 :

에 대한
vec = LETTERS[1:10] 
func = function(x) { 
    paste("Processing item ", x, ", val:" , vec[x], sep="") 
} 

sapply(1:length(vec),func) 
+0

제안 된 솔루션은 인쇄 된 출력을 콘솔과 출력 파일로 보냅니다. 출력 파일에 콘솔을 포함시키고 싶지는 않습니다. 출력에 – user44796

+0

을 포함시키지 않는 방법이 있습니까, 위의 편집을 보시고'print()'를 제거하십시오. – BigDataScientist

+0

코드는 여전히 출력에 인쇄합니다. 예를 들어, out = sapply (1 : length (vec), func)는 출력을 출력합니다. – user44796

3
나는 pbapply 패키지를 사용하는 것이 좋습니다 것

설치 한 후

"진행률 표시 줄을 추가하는 기능을 '* 적용'합니다" 패키지,이 함수에 대해 제공된 예제를 보려면 example("pbsapply")을 실행하십시오.

+0

내 의견으로는 이것은 오버 헤드 코드가 많은 것처럼 보입니다. 난 그냥 행 번호를 인쇄하는 방법을 원해. – user44796

관련 문제