2016-11-01 4 views
0

추정을 반복하고 모든 추정 개체를 저장 한 다음 가장 낮은 편차를 가진 개체를 선택합니다. 이를 위해 Filter/Map/Position 함수를 사용하고 싶었지만 두 번째 대신 항상 목록의 첫 번째 개체를 반환하기 때문에 솔루션을 찾을 수 없었습니다. Position 기능이 어떻게 작동하는지에 대해 아마 오해하지만, 내가 놓친 부분을 알고 싶습니다.상위 차수 함수 찾기 목록의 최소값 찾기

MWE :

ls<-list(3,2,4) 
Position(min,Map(function(x) {x^2}, ls)) 

나는 목록에서 제외 당신이 올바른 절차를 수행 결국

답변

1

which.min를 사용하여 끝났다. 왜? 첫째, 우리는 도움말 페이지에서 두드러진 추출물을 끌어 것 :

Position(f, x, right = FALSE, nomatch = NA_integer_)

FindPosition는 후에 모방하는 커먼 리스프의가 발견-경우 각각 위치하는 경우. 술어 함수가 true 인 요소가있는 경우 right가 false (기본값)인지 true인지에 따라 첫 번째 또는 마지막 요소 또는 해당 위치가 각각 리턴됩니다. 그러한 요소가 없으면 nomatch에 지정된 값이 반환됩니다. 현재 구현은 성능을 위해 최적화되지 않았습니다.

그래서, Position()x와의 모든 요소에 f()을 적용하는 것입니다 f()의 결과는 TRUE (직접 또는 강제를 통해) 아무것도 다음 TRUE되는 끝없는 경우 Position() (즉, 요소의 인덱스를 반환합니다 때 nomatch에 할당 된 값을 반환합니다.

다음은 실제 Position() 기능 소스 : 당신이 prbly min() 목록의 첫 번째 요소에서 호출지고 있음을 볼 수있는 소스에 따라

Position <- function (f, x, right=FALSE, nomatch=NA_integer_) { 

    ind <- seq_along(x) 
    if (right) ind <- rev(ind) 

    for (i in ind) { 
    if (f(x[[i]])) return(i) 
    } 

    nomatch 

} 

그것은 목록에서 벡터의 min() 그 값을 반환 position 1이고 그 값은 0이 아니므로 좋은 작업을했다고 생각하고 그것이 있던 목록 색인을 반환합니다.

것은 당신이하고 있었다 경우 : 당신이 결과를 볼 것이다 다음

Position(min, Map(function(x) {x-3}, dat)) 

가 될 :

## [1] 2 

과 가능성이 일하고 생각하지만, 그것은 단지 반환 사용자들은 첫 번째 요소부터 33-3 == 00의 목록 중 하나는 FALSE으로 강제 변환됩니다.

참고 : ls은 R이 사용법 컨텍스트에 따라 무엇을해야하는지 알기 때문에 기본 함수의 이름이기도하지만 매우 일반적인 코어 네임 스페이스를 분쇄하여 함수 호출에서 이상한 오류를 유발할 수있는 가능성이 싫습니다. 요소이므로 ls 대신 dat을 사용했습니다.

Position() 뒤에 아이디어는 같은 뭔가 더 : 반환하지

eqls4 <- function(x) x==4 

Position(eqls4, Map(function(x) {x^2}, dat)) 

:

그래서, 무슨 일을 결국 것이 100 % 정확했다
## [1] 2 

합니다.

참고도 purrr 패키지 (IMO) 더 읽을 수 + 유지 적절한 유형의 확보 방법을 갖는 경향이 다른 기능 숙어를 제공하고 %>% 이렇게 배관도 쉽게 사용할 내보내는 것을 :

library(purrr) 

map(dat, ~.^2) %>% 
    flatten_dbl() %>% 
    which.min() 
+0

들으 광범위한 대답은 하지만이 방법은 잘못된 방법을 사용하고 있습니다. 왜냐하면 min 함수가 내 목록의 모든 목록 요소에 적용되고 결과가 실패하지 않으면 [1]이 반환되기 때문입니다. 따라서 unlist 등을 사용하는 것이 올바른 접근 방법입니까? –

+0

오른쪽. 'flatten_dbl()'은'unlist'의''안전한''버전 "입니다 (즉, 항상'double's 벡터와 가능하게는 문자 벡터를 리턴합니다). – hrbrmstr

+0

Thx, 나는 단지 호기심이었고 실제로 Position 기능의 범위와 사용법을 오해했습니다. 하지만 어쩌면 다른 사람들을 도울 수 있습니다 :) –