2014-01-08 1 views
0

친구가 벡터의 고유 멤버를 결정할 때이 함수를 작성했습니다. 나는이 한 줄이 무엇을하는지 (정신적으로) 알아낼 수 없으며 그것은 기능의 핵심이다.이 함수에서 &를 사용하는 데 문제가 없음

논리적 = 논리적 & X =의 X [i]를

누군가가 나에게 설명 할 수 있습니다! 어떤 도움을 크게

myUniq <- function(x){ 
    len = length(x)     # getting the length of the argument 
    logical = rep(T, len)    # creating a vector of logicals as long as the arg, populating with true 
    for(i in 1:len){     # for i -> length of the argument 
    logical = logical & x != x[i] # logical vector = logical vector & arg vector where arg vector != x[i] ?????? 
    logical[i] = T 
    } 
x[logical] 
} 

내가 알아낼 수 없습니다이 줄을 감사합니다?

감사합니다, 톰

답변

2

logical 내가 lenTRUE을 포함하는 논리적를 가정, 벡터이다. x은 같은 길이의 다른 데이터의 벡터입니다.

그렇지 x 요소이 반복에 대한 x의 현재 값과 동일하지 TRUEFALSE와 논리 벡터를 생성한다 x != x[i] 번째 부분.

결과적으로 &의 양쪽이 논리 벡터가됩니다. logicalx != x[i] 요소 모두TRUEFALSE 달리 & 경우는 요소 와이즈 AND이 비교의 결과 TRUE이다. 따라서, 첫번째 반복 후 logical 모든 요소 x하지xi=1 th 요소와 동일하고, 그들이 동일한 경우 FALSE위한 TRUE와 논리 벡터로 변경됩니다.

logical <- rep(TRUE, 10) 
set.seed(1) 
x <- sample(letters[1:4], 10, replace = TRUE) 

> x 
[1] "b" "b" "c" "d" "a" "d" "d" "c" "c" "a" 
> logical 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
> x != x[1] 
[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
> logical & x != x[1] 
[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

이것은 매우 복잡한 것 : 여기

는 예를 들어 약간입니다. 같은 결과를 얻으시겠습니까

unique(x) 

당신을 제공합니까? 내가 실행하면 내 myUniq()unique() 나도 같은 출력을 얻을 통해 위의 x는 :

> myUniq(x) 
[1] "b" "d" "c" "a" 
> unique(x) 
[1] "b" "c" "d" "a" 

는 (물론, ... 순서 제외)

+0

당신은 그것을 못을 박았다! 나는 그것을 지금 완벽하게 이해한다 !! 일을하는 방법에 관한 이야기지만, 우리는 독특한 기능의 사용을 피하려고했습니다. 내가 이해 한 루프를 사용했지만 그의 방법은 사용하지 않았다. – traggatmot

+0

'for (i in 1 : len)'을'for (i in 1 : len) if (logical [i]) '로 바꾸면 같은 순서가 생기고 (함수를보다 효율적으로 만들 수 있습니다). 일단 중복 된'a'가 모두 제거되면'a''를 다시 볼 필요가 없습니다. –