2017-03-16 2 views
1

readline()의 결과가 숫자인지 확인하는 방법이 있는지 물어보고 싶습니다.readline에서 문자 입력을 검사 할 수있는 방법이 있습니까?

이 입력을 사용하여 수학 연산을 수행해야하므로 숫자와 "."이외의 모든 문자가 필요합니다. 프로그램을 파괴합니다.

각 문자를 확인하려면 문자로 된 입력 문자열을 사용해야합니까? 아니면 그것을 할 수있는 우아한 방법이 있습니까?

+1

'readline()의 값은 "길이가 1 인 문자 벡터"('? readline'을 인용)입니다. 왜 그것을 as.numeric()으로 싸서 프로그램을 NA 입력에 맞게 만들면 어떨까요? –

+0

@apom as.numeric을 사용할 때의 문제점은 기본적으로 입력을 변경한다는 것입니다. 예를 들어 입력이 "2.8"대신 "2,8"이고 결과가 숫자 2가 될 경우 –

답변

1

함수 readline()은 항상 문자열을 반환합니다. 두 가지 방법으로 처리 할 수 ​​있습니다

  • as.numeric()에 무력을 사용 :이 NA으로 숫자로 변환 할 수있는 일을 반환합니다. 그런 다음 is.na()으로 확인하여이 방법이 효과가 있는지 확인할 수 있습니다.
  • 정규식 사용 grepl()을 사용하면 벡터의 모든 요소에 대해 TRUE/FALSE 값을 얻을 수 있습니다.이 값은 일부 문자를 찾았는지 여부를 나타냅니다. 다음과 같이

    x <- readline("give a number: ") 
    if(grepl("[^[:digit:]\\.-]",x)) stop("This is not a number") else "Hooray" 
    

    작품 :

    > x <- readline("give a number: ") 
    give a number: -23.48 
    > if(grepl("[^[:digit:]\\.-]",x)) stop("This is not a number") else "Hooray" 
    [1] "Hooray" 
    > x <- readline("give a number: ") 
    give a number: -25.645) 
    > if(grepl("[^[:digit:]\\.-]",x)) stop("This is not a number") else "Hooray" 
    Error: This is not a number 
    

    철저하게 뭔가가 (과학적 표기법 포함) 숫자로 포맷되어 있는지 여부를 확인하고 싶은 경우는, 이것은이다

은 다음 시도 다음과 함께 테스트하는 고전적인 정규 표현식 :

"ˆ[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$" 

그러면 다음과 같이됩니다 :

x <- readline("give a number: ") 
isnumber <- grepl("ˆ[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$",x) 
if(!isnumber) stop("X is not a number") else "Hooray" 
+0

regexp에 몇 가지 잠재적 인 구멍이 있음 ; ''13.234.2342 ''를 테스트 케이스로 사용하면 어떨까요? '+ 23'은 합법적 인 번호입니까? '1.0e23'은 어때? –

+0

@BenBolker 두 번째 정규식으로 모든 문제를 해결했습니다. –

관련 문제