which.min를 사용하여 끝났다. 왜? 첫째, 우리는 도움말 페이지에서 두드러진 추출물을 끌어 것 :
Position(f, x, right = FALSE, nomatch = NA_integer_)
Find
및 Position
는 후에 모방하는 커먼 리스프의가 발견-경우 각각 위치하는 경우. 술어 함수가 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
과 가능성이 일하고 생각하지만, 그것은 단지 반환 사용자들은 첫 번째 요소부터 3
및 3-3 == 0
및 0
의 목록 중 하나는 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()
들으 광범위한 대답은 하지만이 방법은 잘못된 방법을 사용하고 있습니다. 왜냐하면 min 함수가 내 목록의 모든 목록 요소에 적용되고 결과가 실패하지 않으면 [1]이 반환되기 때문입니다. 따라서 unlist 등을 사용하는 것이 올바른 접근 방법입니까? –
오른쪽. 'flatten_dbl()'은'unlist'의''안전한''버전 "입니다 (즉, 항상'double's 벡터와 가능하게는 문자 벡터를 리턴합니다). – hrbrmstr
Thx, 나는 단지 호기심이었고 실제로 Position 기능의 범위와 사용법을 오해했습니다. 하지만 어쩌면 다른 사람들을 도울 수 있습니다 :) –