2014-11-09 2 views
0

효율적인 R programm는 가능할 때마다 루프를 사용하지 말고 대신 적용 함수의 큰 계열을 사용해야한다고 완전히 확신합니다. 하지만 고통 없이는 이런 일이 일어날 수 없습니다. 예를 들어 솔루션에 적용된 함수의 합계가 포함 된 문제가 발생하여 결과 목록이 원하는 값이 아닌 단일 값으로 줄어 듭니다. 난 당신이 하나의 값또 다른 적용 질문들

모든 것을 붕괴 할 내부의 합을 사용하는 반면 을 폭발 내장 벡터의 원인 길이 내부의 기능을 볼 수 있듯이 N =100

sapply(list(1:N), function(n) (
    choose(n,(floor(n/2)+1):n) * 
    eps^((floor(n/2)+1):n) * 
    (1- eps)^(n-((floor(n/2)+1):n)))) 

가정 내 문제를 단순화하기 위해 노력할 것입니다 구체적으로

sapply(list(1:N), function(n) (
    choose(n,(floor(n/2)+1):n) * 
    eps^((floor(n/2)+1):n) * 
    (1- eps)^(n-((floor(n/2)+1):n)))) 

내가 갖고 싶은 것은 N의 학위 목록입니다. 그래서 어떻게 생각하십니까? 어떻게 수리 할 수 ​​있습니까?

+3

나는 항상 전세계에 가서 누가'apply'가'for' 루프가 아닌지 확신하는 사람이 누구인지 궁금합니다. –

+0

@DavidArenburg data.table은 루프를위한 하나의 큰 것입니다. – rawr

+0

@raw, 모든 것이 단지 'for'루프 일 뿐이며 질문은 어떤 언어로 쓰여졌 을까요?'for '루프와'* apply'는 본질적으로 동일하며 (R로 작성된 for 루프), 벡터화 된 함수는 완전히 다른 C/C++ for 루프입니다. 'for '루프에 대한 생각을 표현하지 않았다는 것을 언급하지 말고, 오히려이 말에 놀랐다. * 효율적인 R 프로그램은 가능할 때마다 루프를 사용해서는 안되며 대신 큰 함수 적용 함수를 사용해야한다고 완전히 확신했다. * –

답변

7

귀하의 질문 (? "분기 EPS"무엇) 재현 코드가 포함되어 있지 않지만, 루프와 최적화 코드에 대한 일반 지점 : 루프

는 믿을 수 없을 정도로 느린되지 않습니다. for 루프는 객체에 메모리를 할당하는 방법 때문에 부적절하게 사용되면 엄청나게 느립니다. 원시 객체 (벡터와 같은)의 경우 필드 값을 수정하는 데는 약간의 비용이 듭니다. 실제로 벡터의/length /를 확장하는 것은 상당히 비용이 많이 듭니다. 실제로 수행하는 작업은 완전히 새로운 객체를 만들고 해당 객체의 공간을 찾는 것이기 때문에 (예 : 데이터 프레임)의 경우, 모든 수정이 data.frame의 길이를 변경하지 않더라도이 작업을 트리거하기 때문에 더 많은 비용이 소요됩니다 방법.

하지만 for : for 루프를 최적화하고 신속하게 실행할 수있는 방법이 있습니다. 가장 쉬운 지침은 다음과 같습니다.

  1. data.frame에 쓰는 for 루프를 실행하지 마십시오. 선호도에 따라 plyr 또는 dplyr 또는 data.table을 사용하십시오.
  2. 벡터를 사용하고 있고 출력의 길이를 미리 알 수 있다면 훨씬 빠르게 작동합니다. 출력 객체를 쓰기 전에 크기를 지정하십시오.
  3. 루프를 피하면서 매듭을 만들지 마십시오.

그래서이 경우에 - 당신은 단지 N의 각 일에 대한 단일 값을 생성하는 경우, 당신은 벡터와 완벽하게 잘 그 일을 할 수 있습니다 :

#Create output object. We're specifying the length in advance so that writing to 
#it is cheap 
output <- numeric(length = length(N)) 

#Start the for loop 
for(i in seq_along(output)){ 
    output[i] <- your_computations_go_here(N[i]) 
} 

이 실제로 특히 아니다 천천히 - 당신이 벡터에 글을 쓸 때 길이를 미리 지정했기 때문에. 그리고 data.frames는 실제로 같은 크기의 벡터 목록이기 때문에 데이터를 통해 for 루프를 실행하면 몇 가지 문제를 해결할 수 있습니다. data.frame의 단일 열에 작성하는 경우 벡터로 작성한 다음 df$new_col <- output을 통해 data.frame에 작성하면됩니다. data.frame을 반복 할 때와 같은 출력을 얻지 만, 한 번만 수정해야하기 때문에 더 빨리 작동합니다.

+1

마지막 문장에서 나는 "빠름"을 의미한다고 생각합니다. –

+0

오 와우. brainfarts가가는 것에 따라, 그것은 꽤 훌륭한 사람이었다. –

+0

첫 번째 글 머리표에서'plyr'을 안전하게 제거 할 수 있습니다. 기본 R 함수보다 일반적으로 비늘이 더 큽니다. –