이것은 흥미로운 토론입니다. @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이 재미있는 프로그래밍 언어라고하기 때문입니다.