2014-03-28 3 views
0

적용 계열이 역행 입력으로 R에서 사용될 수 있는지 궁금합니다. 내가 가진 말 :이 전 세계적으로 MyMatrix을 수정 MyMatrix의 첫 번째 줄에 걸쳐 MyFunc 중 하나 반복을 실행 한 다음에 대한 수정 MyMatrix를 선택할 수 위의 예에서, 그래서 기본적으로 루프 적용 내가 아는R의 동적 입력 적용

apply(MyMatrix,1,MyFunc,MyMatrix) 

다음 반복? 나는 정상적인 루프가 여기서 사용될 수 있다는 것을 알았지 만 이런 식으로 할 수있는 방법이 있는지 알고 싶었습니다.

감사합니다.

답변

2

저는 그렇게 생각하지 않습니다. MyMatrix을 전역으로 수정하더라도 함수에 전달 된 MyMatrix은 변경되지 않습니다. R 함수는 그런 식으로 작동하지 않습니다. 당신의 객체는 실제로 함수로 전달되고 그 객체의 새로운 인스턴스가 존재할 때 실제로 복사됩니다. 그것은 참조로 완료되지 않았습니다.

+0

내가 생각한 것입니다. 루프를 피하려고했지만 지금은 적용이 다른 루프 일 뿐이며 효율성을 얻지 못한다는 것을 알았습니다. 시간 내 줘서 고마워 ! – Pane

1

불행히도 *apply 계열의 기능은 이러한 방식으로 작동 할 수 있습니다. (이것은뿐만 아니라 시간에 나에게 좌절했다, 그러나 나는 감사와 함께 출근했습니다.)이 두 가지 장애물이있다

:

  1. 기능 거래의 *apply 가족 전화를 걸 때 MyMatrix의 값으로 행을 반복 한 다음 (각 출력의 차원을 기준으로) 결과를 조인합니다. 매번 재평가되지 않습니다.

  2. 다시 평가 한 경우에도 MyFunc은 전체 행렬이 아닌 한 번에 한 행 (이 예에서는) 만 지정됩니다. (MyMatrix에 두 번째 참조는이 문제 일 것으로 보인다.)

난 당신이 다음 MyFunc 함수는 인수로 당신이있는 전체 매트릭스 행을 받아 들일 필요가 말을하는지 무슨 생각을하려면 당신은 유지해야하는 경우,

for (rr in seq.int(nrow(MyMatrix))) { 
    MyMatrix[rr,] <- MyFunc(rr, MyMatrix) 
} 

또는 : 운영 및 람, 질문에 바로 행을 리턴 : 그 전제를 사용

MyFunc <- function(rownum, mtx) { 
    # ... 
    mtx[rownum,] 
} 

, 당신은 할 수 *apply 가족과 함께 :

MyMatrix.new <- sapply(seq.int(nrow(MyMatrix)), MyFunc, MyMatrix) 

당신은 여기 sapply()의 반환의 전치 (t())를 할 수 있습니다.

MyFunc이 단 하나의 행 대신 전체 행렬을 반환하는 경우 조금 다르게 수행 할 수 있습니다.

내가 제안한 것을 직접 수행 할 수있는 방법이 없습니다.

+0

나는 아무 방법도 없다고 생각한다. 나는 [나는 방금 이것을 깨달았다]는 기본적으로 루프라는 것을 알고 있지만, 나는 모든 비용으로 루프를 피하는 습관이 좋지 않다고 생각한다. 시간 내 줘서 고마워 ! – Pane

+0

나는 루프도 피했지만 최근의 성능 벤치 마크는 루프가 반드시 느린 것은 아니라는 것을 보여줍니다. 'apply' 패밀리가 진정으로 우아한 해결책을 제공하는 때가 있습니다 만, 실제로 루프를 위해 훨씬 더 읽기 쉬울 때 그 우아함을 얻기 위해 열심히 노력하고 있습니다. 건배! – r2evans