2014-05-13 2 views
0

약 일주일 전에 r을 시작했습니다. 내 디렉토리에는 001, 002, ... 010, ... 331이라는 CSV 파일이 있습니다. 아래의 부분 기능에서 사용자는 ID (예 : 1 : 9)를 입력해야합니다. ID는 001, 002, 003, ... 009로 변환됩니다. 그러나 사용자가 id에 대해 1:10이라고 말하면 함수는 id [10]을 "010"대신 "0010"으로 출력합니다. 이로 인해 나머지 기능이 실패하게됩니다. 무슨 일이 벌어 질지에 대한 제안? 1:10을 입력하면 001, 002, 003, 004, 005, 006, 007, 008, 009 및 이 표시됩니다.콜론을 사용하여 함수에서 시퀀스 지정

pollutantmean <- function(directory, pollutant, id) { 

    if((id>=1) && (id<10)) { 
      fn <- paste("00",id,sep="") 
      print(fn) 
    } else if((id>=10) && (id<=99)) { 
      fn <- paste("0",id,sep="") 
      print(fn) 
    } else { 
      fn <- id 
      print(fn) 
    } 

제발 내가 R 적용 기능을 사용하고 싶지 않습니다. 나는 그걸 멀리 얻지 못했다.

+3

'sprintf'를 사용하면 많은 시간을 절약 할 수 있습니다. sprintf ("% 03d", 1 : 10)' – thelatemail

+0

방금 ​​모든 것을'fn <- sprintf ("% 03d", id)'로 바꿨고, 그것은 매력처럼 작동했습니다. 이것은 자바에서'System.out.printf'처럼 보입니다. 하지만 첫 번째 방법이 실패한 이유는 무엇입니까? 나는 그것을 짐작할 수 없다. 그리고 우리는이 매끄러운 sprintf 메소드를 가르쳐주지 않았습니다.이 메소드는 제 첫 번째 메소드가 여전히 약간의 개조와 함께 작동 할 수 있음을 시사합니다. – sedeh

답변

2

귀하의 기능은 비슷하지만 단일 번호 만 평가합니다 id. 나는 숫자의 범위를 처리 할 for 루프를 추가 :

pollutantmean <- function(idrange) { 
    for(id in idrange){ 
    if((id>=1) && (id<10)) { 
    fn <- paste("00",id,sep="") 
    print(fn) 
    } else if((id>=10) && (id<=99)) { 
    fn <- paste("0",id,sep="") 
    print(fn) 
    } else { 
    fn <- id 
    print(fn) 
    }} 
} 

내가 디렉토리와 오염 물질 인자를 제거를하지만 그들은 쉽게 다시 추가 할 수있는이 기능은 관심의 범위에있는 모든 숫자를 평가하고이를 인쇄합니다. out :

R> pollutantmean(1:10) 
[1] "001" 
[1] "002" 
[1] "003" 
[1] "004" 
[1] "005" 
[1] "006" 
[1] "007" 
[1] "008" 
[1] "009" 
[1] "010" 
R> 
2

if 문과 단락 회로 인 && 연산자를 사용하고있는 것이 문제입니다. 이 경우 &&은 벡터 id의 첫 번째 요소 만보고 거기에서 결정을 내립니다. 이 경우 (1>=1) && (1<10)이므로 첫 번째 블록을 실행합니다. 그런 다음 벡터화 된 fn <- paste("00",id,sep="")을 호출하면 전체 id 벡터에서 작동하므로 모든 요소에 '00'이 추가됩니다. 암시 적 루프가있는 것처럼 함수를 처리하는 것처럼 보이지만 그렇지 않습니다. fn <- sprintf("%03d",id)의 코스 @의 thelastemail의 제안의

이 경우 올바른 일이지만, 단지 설명을 위해, 당신의 코드는 암시의 종류가 않습니다

fn <- paste(ifelse(id<10, "00", ifelse(id<100, "0", "")),id,sep="") 

ifelse 때문으로 다시 작성할 수 있습니다 벡터의 모든 요소에 대해 다른 결정을 내릴 수 있다는 점에서 반복됩니다.

+0

이것은 또한 작동합니다. 큰! sprintf를 사용하지 않고 어떻게 소수 자릿수 3 자리까지 포맷 할 수 있는지 알고 있습니까? Sprintf는 문자열을 출력합니다. 정수가 필요합니다. – sedeh

+0

@sedeh 음, 먼저 정수에는 소수 자릿수가 없습니다. 그리고 포맷팅이 걱정된다면 문자열을 원한다고 들립니다. 그렇지 않으면 010과 10의 차이점은 무엇입니까? sprintf에 입력하는 값은 "숫자"값이며, 사용자가 얻는 값은 형식화 된 "문자"값입니다. – MrFlick

3

이렇게하면 "0"은 3 개의 문자로 나뉘며 숫자 값은 스팅으로 간주됩니다.

sprintf("%03s", 1:10) 
[1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" 
관련 문제