2013-01-04 4 views
19

목록의 경우 기본 연산자 $[[을 사용하여 색인을 생성 할 때 부분 일치가 수행된다는 것을 알고 있습니다. 예를 들어 :함수 인수의 부분 일치

ll <- list(yy=1) 
ll$y 
[1] 1 

하지만 여전히 R 초보자 오전이 나를 위해 새로운, 함수 인수의 부분 일치 :이 작동 방식을 이해하려면

h <- function(xx=2)xx 
h(x=2) 
[1] 2 

. 그 뒤에있는 메커니즘은 무엇입니까? 이것에는 어떤 부작용이 있습니까? xx 인수가 주어진다면 누군가가 어떻게 테스트 할 수 있는지 이해하고 싶습니다. Andrie 주석 후

편집 :

내부적으로 R 여기에, 이것이 어떻게 작동하는지 예를 들어 인수를 일치 pmatch 알고리즘을 사용

pmatch("me", c("mean", "median", "mode")) # error multiple partial matches 
[1] NA 
> pmatch("mo", c("mean", "median", "mode")) # mo match mode match here 
[1] 3 

을 왜 R는 특징이있다? partial unique의 기본 아이디어는 무엇입니까?

+3

http://cran.r-project.org/doc/manuals/R-lang.html#Argument-matching 읽기 – Andrie

+1

@Andrie 링크를 제공해 주셔서 감사합니다! R이 왜이 기능을 가지고 있는지 설명하지 못하더라도 대답으로 받아 들일 것입니까? 여러 부분 일치가있는 것은 오류이므로 다른 기능의 부작용처럼 보입니다. – agstudy

+3

다음은 "이유"에 대한 추측입니다. R은 명령 행 통계 언어로 설계되었습니다. 데이터를 빠르고 쉽게 분석 할 수있는 방법. 부분 일치는 명령 행 분석을 더 쉽게 만듭니다 (그러나 프로그래밍은 더욱 어려워집니다). – csgillespie

답변

17

긴 인수 이름을 입력하지 않아도되도록 부분 일치가 있습니다. 그 위험은 함수가 나중에 부분 일치와 충돌하는 추가 인수를 얻을 수 있다는 것입니다. 즉, 오랫동안 (예를 들어 패키지에 들어가기 위해) 코드를 작성하는 경우 대화식 사용 –에만 적합하다는 것을 의미합니다. 그런 다음 항상 전체 인수 이름을 작성해야합니다. 다른 문제는 인수 이름을 약자로 표시하여 코드를 읽기 쉽게 만들 수 있다는 것입니다.

두 가지 일반적인 좋은 용도는 다음과 같습니다

seq (또는 seq.int) 기능
  1. len 대신 length.out.

  2. allls 기능 대신 all.names 대신에. 두 경우 모두

    seq.int(0, 1, len = 11) 
    seq.int(0, 1, length.out = 11) 
    
    ls(all = TRUE) 
    ls(all.names = TRUE) 
    

    이 코드는 바로 단축 인수 이름과 읽기 쉬운에 대해, 그리고 기능은 이전과 또 다른 인수 충분한 안정 :

비교 충돌하는 이름은 추가 될 것 같지 않습니다.

변수 이름과 변수 이름의 자동 완성 기능을 사용하려면 입력시 절약 할 수있는 더 좋은 해결책은 축약 된 이름을 사용하는 것이 아니라 더 나은 방법입니다. R GUI 및 RStudio는 TAB 키를 사용하여이를 지원하며 Architect는 CTRL + 키를 사용하여 이것을 지원합니다.

+1

나는'ls'에서'a = T'를 사용합니다. 때로는 arg 이름을 아는 경우 이걸 가지고 도망 갈 수 있습니다. –

+2

이 디자인 결정에 대한 일반적인 의견. /facepalm이 부분적으로 일치하는 인수 이름의 기능으로 인해 아무 이유없이 디버깅 두통이 발생할 수 있습니다. 1. 긴 인수 이름을 입력하기 위해 cbb를 사용하면 처음부터 오랫동안 이름을 지정하지 않습니까? 2. 탭 자동 완성 FTW! –