[r] 부울 연산자 && 및 ||

받는 따르면 R 언어 정의 의 차이 &&&(대응 |하고 ||), 후자는 아니지만 전자 벡터화된다는 것이다.

도움말 텍스트 에 따르면 , “And”와 “AndAlso”( “Or”및 “OrElse”)의 차이점과 유사한 차이점을 읽습니다. 의미 : 모든 평가가 필요하지 않은 경우 (예 : A가 참이면 A 또는 B 또는 C는 항상 참이므로 A가 참인지 평가를 중단하십시오)

누군가 여기에서 빛을 비출 수 있습니까? 또한 R에 AndAlso와 OrElse가 있습니까?



답변

짧은 것은 벡터화되어 다음과 같이 벡터를 리턴 할 수 있음을 의미합니다.

((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE  TRUE FALSE FALSE

긴 형식은 왼쪽에서 오른쪽으로 평가하여 각 벡터의 첫 번째 요소 만 검사하므로 위의 내용은

((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE

도움말 페이지에서 알 수 있듯이 더 긴 형식은 “제어 흐름 프로그래밍에 적합하며 일반적으로 if 절에서 선호됩니다.”

따라서 벡터가 길이가 1 인 것이 확실한 경우에만 긴 형식을 사용하려고합니다.

당신이해야 절대적으로 그들이 그 수익 만 길이가 1 인 부울 함수입니다 어디에 벡터는 이러한 경우에서와 같이 유일한 길이 1, 수있는 특정. 벡터 길이가 1보다 큰 경우 짧은 형식을 사용하려고합니다. 당신이 절대적으로 확실하지 않은 경우 그래서, 당신이 중 하나를 먼저 확인해야한다, 또는 사용 후 짧은 형식을 사용 all하고 any같은 제어 흐름 문에서 사용하기위한 길이 하나에 감소 if.

함수 allany벡터화는 종종 벡터화 된 비교 결과에 사용되어 비교의 전부 또는 일부가 각각 참인지 확인합니다. 이러한 함수의 결과는 길이 1이어야하므로 if 절에 사용하기에 적합하지만 벡터화 된 비교의 결과는 그렇지 않습니다. (그러나 이러한 결과는에서 사용하기에 적합합니다 ifelse.

마지막 차이점은 다음 &&과 같습니다. 그리고 ||필요한만큼의 용어 만 평가합니다 (단락이 의미하는 것 같습니다). 예를 들어, 다음은 정의되지 않은 값을 사용한 비교입니다 a. 이 단락은,하지 않은 것처럼 &|하지 않습니다, 그것은 오류를 줄 것이다.

a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found

마지막으로 “and and andand “라는 제목 의 R Inferno 섹션 8.2.17을 참조하십시오 .


답변

“단락” 에 대한 대답 은 잠재적으로 오도의 소지가 있지만 약간의 진실이 있습니다 (아래 참조). 는 R에서 / 언어 S, &&그리고 ||첫 번째 인수의 첫 번째 요소를 평가한다. 벡터 또는 목록의 다른 모든 요소는 첫 번째 요소 값에 관계없이 무시됩니다. 이 연산자는 if (cond) {} else{}새로운 벡터를 생성하는 대신 건설 작업을 수행하고 프로그램 제어를 지시 하도록 설계되었습니다 &. |연산자는 벡터에 대해 작업하도록 설계되어 있으므로 “병렬”로 적용되어 가장 긴 논쟁. 비교하기 전에 두 벡터를 모두 평가해야합니다. 벡터의 길이가 같지 않으면 더 짧은 인수의 재활용이 수행됩니다.

에 인수하는 경우 &&또는 ||평가 연속적으로 값 중 하나입니다 왼쪽에서 오른쪽으로하면, “단락”는 점에서이 결정적 다음 평가를 중단하고 최종 값이 반환됩니다.

> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3

단락의 장점은 인수를 평가하는 데 시간이 오래 걸리는 경우에만 나타납니다. 일반적으로 인수가 더 큰 객체를 처리하거나 더 복잡한 수학적 연산을 수행하는 함수일 때 발생합니다.


답변

&&그리고 ||“단락”무엇을라고합니다. 즉, 첫 번째 피연산자가 식의 값을 결정하기에 충분하면 두 번째 피연산자를 평가하지 않습니다.

행의 첫 번째 피연산자는 예를 들어 &&거짓 다음의 식의 값을 변경 (수 없기 때문에, 두 번째 피연산자 평가 소용 없다 false && true하고 false && false모두 거짓). 동일은 간다 ||첫 번째 피연산자에 해당하는 경우.

당신은 더 이것에 대해 여기 읽을 수 있습니다 : http://en.wikipedia.org/wiki/Short-circuit_evaluation을 테이블에서 해당 페이지에 당신이 볼 수 &&에 해당 AndAlso난 당신이 언급하는 가정 VB.NET,있다.


답변