이것은 흥미로운 토론입니다. @flodel의 예가 훌륭하다고 생각합니다. 그러나 기능적 코딩 스타일 대신 명령return 을 사용할 때 의미 가있는 내 요점 (@koshke가 주석에서 언급 함)을 보여 줍니다 .
요점은 아니지만 foo다음과 같이 다시 작성했을 것입니다 .
foo = function() ifelse(a,a,b)
기능적 스타일은 값 저장과 같은 상태 변경을 피 output합니다. 이 스타일에서는 return제자리에 있지 않습니다. foo수학 함수처럼 보입니다.
@flodel에 동의합니다. 복잡한 부울 변수 시스템을 사용하면 bar덜 명확하고 무의미합니다 return. 진술에 bar매우 적합 하게 만드는 return것은 명령형으로 작성되었다는 것입니다. 실제로, 부울 변수는 기능적 스타일에서 피한 "상태"변경을 나타냅니다.
bar단순한 의사 코드이기 때문에 기능적 스타일 로 다시 작성하는 것은 실제로 어렵지만 아이디어는 다음과 같습니다.
e_func <- function() do_stuff
d_func <- function() ifelse(any(sapply(seq(d),e_func)),2,3)
b_func <- function() {
do_stuff
ifelse(c,1,sapply(seq(b),d_func))
}
bar <- function () {
do_stuff
sapply(seq(a),b_func) # Not exactly correct, but illustrates the idea.
}
while가에 상태 변화에 의해 제어되기 때문에 루프는 다시 작성하기가 가장 어려울 것이다 a.
호출로 인한 속도 손실 return은 무시할 만하지 만 return기능적 스타일 을 피하고 다시 작성하여 얻는 효율성 은 종종 막대합니다. 새로운 사용자에게 사용을 중지하라고 return해도 도움이되지 않지만 기능적인 스타일로 안내하는 것이 좋습니다.
@Paul return은 루프의 다른 지점에서 함수를 종료하려는 경우가 많으므로 명령형 스타일이 필요합니다. 기능적 스타일은 루프를 사용하지 않으므로 필요하지 않습니다 return. 순전히 기능적인 스타일에서 최종 호출은 거의 항상 원하는 반환 값입니다.
파이썬에서 함수에는 return문장이 필요합니다 . 그러나 기능적 스타일로 기능을 프로그래밍 한 경우 기능 return이 끝날 때 하나의 명령문 만있을 수 있습니다.
다른 StackOverflow 포스트의 예제를 사용하여 TRUE주어진 모든 값의 x길이가 홀수 인 경우 반환되는 함수를 원한다고 가정합니다 . 우리는 두 가지 스타일을 사용할 수 있습니다 :
# Procedural / Imperative
allOdd = function(x) {
for (i in x) if (length(i) %% 2 == 0) return (FALSE)
return (TRUE)
}
# Functional
allOdd = function(x)
all(length(x) %% 2 == 1)
기능적 스타일에서 반환되는 값은 자연스럽게 함수의 끝에 해당합니다. 다시 한 번 더 수학 함수처럼 보입니다.
@GSee 여기에 설명 된 경고 ?ifelse는 확실히 흥미롭지 만, 함수 사용을 설득하려고하지는 않습니다. 실제로 ifelse자동으로 함수를 벡터화하는 이점이 있습니다. 예를 들어, 약간 수정 된 버전을 생각해보십시오 foo.
foo = function(a) { # Note that it now has an argument
if(a) {
return(a)
} else {
return(b)
}
}
때이 기능은 잘 작동 length(a)1입니다하지만 당신은 다시 썼다 경우 foo로ifelse
foo = function (a) ifelse(a,a,b)
이제 foo모든 길이에서 작동합니다 a. 사실, 그것은 a행렬 일 때도 작동 합니다. test문제가 아닌 벡터화에 도움이되는 기능 과 동일한 모양을 반환합니다 .
return마지막 예에서도 불필요합니다. 제거return하면 조금 더 빨라질 수 있지만, 제 생각에는 R이 재미있는 프로그래밍 언어라고하기 때문입니다.