2011-06-14 4 views
4

최근에 나는 replace()"[<-"을 우연히 만났습니다. 차이를 명확히하기replace() vs "[<-"?

 > x.tst <- array(1:6, c(2,3)) 
     > s.tst <- array(0, c(2,3)) 
     > s.tst 
      [,1] [,2] [,3] 
     [1,] 0 0 0 
     [2,] 0 0 0 
     > s.tst[1:3] <- 1 
     > "[<-"(x.tst, s.tst==1, 0) 
      [,1] [,2] [,3] 
     [1,] 0 0 5 
     [2,] 0 4 6 
     > x.tst 
      [,1] [,2] [,3] 
     [1,] 1 3 5 
     [2,] 2 4 6 

수 누군가 도움말 : 그들은 "[<-"와 예를 들어, 나는 이런 식으로 뭔가를 할 수있는, 유사한 기능을 갖고있는 것 같다? replace"[<-"의 강점은 무엇이며 그 반대입니까?

답변

7

기본적으로 정확히 똑같습니다. 당신은 대체의 소스 코드를 보면, 당신은 볼 수 있습니다 :

> replace(x.tst, s.tst==1, 0) 
    [,1] [,2] [,3] 
[1,] 0 0 5 
[2,] 0 4 6 

당신이 필요로하는 경우에 당신에게 속도 향상을 제공 할 수 있습니다 [<- 사용 :

function (x, list, values) 
{ 
    x[list] <- values 
    x 
} 
<environment: namespace:base> 

그래서 대체

은 아무것도하지만 [<-의 래퍼입니다 래퍼 함수에 대한 추가 호출을 잃어 버리면이 작업을 100 만 회 수행해야합니다. 그러나 실제로는 중요하지 않으므로 선택의 문제입니다. replace()은 조금 더 읽을 수 있습니다.

Btw, x.tst[s.tst==1] <- 0"[<-"(x.tst, s.tst==1, 0)보다 읽기 쉽습니다. 새로운 데이터 프레임에 결과를 저장하려는 경우가 아니면 해당 구문을 사용할 이유가 없습니다.

@Andrie가 지적했듯이 replace()"[<-"(x.tst, s.tst==1, 0) 둘 다 관련 값이 변경된 전체 x.tst의 사본을 얻습니다. 그래서 당신은 그것을 새로운 대상에 넣을 수 있습니다. 이것은 xtst 자체의 값을 변경하는 x.tst[s.tst==1] <- 0과 반대입니다. R이 조작을하기 전에 x.tst의 복사본을 내부적으로 만들 것이므로 기억하지 마십시오.

타이밍 결과 :

> system.time(replicate(1e6, replace(x.tst, s.tst==1, 0))) 
    user system elapsed 
    12.73 0.03 12.78 

> system.time(replicate(1e6, "[<-"(x.tst, s.tst==1, 0))) 
    user system elapsed 
    6.42 0.02 6.44 

> system.time(replicate(1e6, x.tst[s.tst==1] <- 0)) 
    user system elapsed 
    5.28 0.02 5.32 
+1

하나 하나 개의 작은 차이, 내 생각은, '대체한다는 것입니다 (X, 목록, ...)'반면'X [목록] × 수정되지 않습니다 <- ... '는 x를 수정할 것입니다. 그래서'replace'는 약간 다르게 사용될 수 있습니다. – Andrie

+2

휴. 너희들은 책이나 뭐라도 써야 해! –

+0

@Andrie : 실제로, 대답에 –