본문 바로가기
컴퓨터/디버깅

R 사용하기 (초보)

by adnoctum 2010. 10. 21.

   오늘 처음으로 R 을 써먹기 위해 이것저것 하고 있다. 어떤 문제들을 겪고, 어떻게 해결해 나가는지 살펴 보기 위해 기록한다.

우선, RGui 에서 스크립트를 작성하기 위해 새로운 스크립트를 열어서 몇 가지 명령어를 집어 넣은 후 실행을 시키기 위해 기계적으로 F5 를 눌렀는데, 계속 이상하게 실행이 된다. 그래서 찾다찾다 메뉴에 보니 줄 실행과, 전부 실행이 따로 있다. 따라서 F5는 아마도 커서가 있는 위치의 줄만 실행시키는 것 같아서, 전체를 선택하고 F5를 누르니 역시 문제 없이 실행된다. >.<"" F5는 선택된 영역만 실행하는 것이었어...


   다음으로는, 특정 폴더에 있는 파일 리스트를 다 가져와서, 뭔가를 계산하고, 그것을 다시 '파일이름.qvalue.txt' 로 출력을 하고 싶었다. 특정 폴더에 있는 파일 리스트를 가져 오는 것은 구글링으로 금방 찾아냈고, for 문을 통해 다음과 같이 작성했었다.

G <- list.files(init_dir, pattern="*.pvalue.txt")
for (f in G){
      out_name = cat(f, ".qvalue.txt", sep="");
      write("aa", out_name);
      unlink(out_name);
}

근데 위의 코드가 계속 에러가 난다. 에러 내용은

GSE10810.pvalue.txt.qvalue.txtwrapup동안에 에러가 발생했습니다[tcl] invalid command name ".1.1.5.1".

인데, 구글링을 좀 해보니, 위 에러는 Rgui인 Tcl 라이브러리 쪽에서 나온 에러이고, 실제로 난 에러에 대한 메세지는 아니라는 것을 알게 되었다. 즉, 에러가 나긴 했는데, 그 에러에 대한 메세지가 출력된 것은 아닌 것. -_-;;; 뭐야... 처음에는 파일을 쓸 때 열고 뭔가 깔끔하게 처리하지 않아서 그런 것 같아서 unlink 를 추가시켰는데도 계속 에러가 났다. R은 힘든 작업은 for 문의 각 반복 마지막에 몰아서 한 후 console 로 출력을 하는 것 같은데, 그렇게 되면 write 할 때 에러가 나도 에러가 났다는 메세지는 나중에서야 출력이 되겠지. 결국 write 를 시도하는 부분에서 에러가 났을 것으로 추정. 근데 저 줄에서는 에러 날 것이 없고, 더구나 console에서 해보면 되거든. 결국 out_name 이 뭔가 이상할 것으로 예상. out_name 의 data type 을 확인하고자 str(out_name) 을 해보았다. 파이썬에서 type  으로 데이터를 타입을 확인할 수 있기 때문에 그에 해당하는 R 명령어가 뭔지 궁금했는데, 다른 것 찾다가 우연히 보게 되었고... 어쨌든, 그런데 왜 NULL 이 나올까? 해서 다시 확인해 보니, cat 은 단순히 출력하는 명령어, 문자열을 더한 후 문자열을 반환하는 함수는 paste 였다. 음..., C 에서 strcat, 델파이에서도 이 비슷한 류를 써 왔고 (심지어 matlab에서도) 그래서 별 의심없이 당연히 문자열이 반환될 줄 알았는데... 여하튼, write 에서 두 번째 parameter로 NULL type 을 넘기니 쓸 곳이 없고, 그래서 에러가 날 수밖에... 어쨌든 이것은 또 이렇게 해결.

   아니, 그런데 왜 자꾸 파일이 줄어드나 해서 다시 보니 왠지 unlink 가 이상하다. 당장 help(unlink)해서 보이, 헐, 파일을 지우는 명령어였어.. 예제에 tidy up 한다고 해서 해서 나쁠 것 없다고 생각해서 했더니만... 그리고, pattern도 python의 glob과 달리 기본적으로 앞 뒤 * 가 있다고 가정하는듯, 결국 pattern="*.pvalue.txt$"로 마지막이라는 것을 알려주기 위해 $ 를 추가. 확실히 정규표현식은 유용하다, 펄 사용하면서 익혀 둔 것이 두고두고 도움이 된다.


   그래서 결국 p-value가 들어 있는 파일에서 값을 읽어 와서 q-value로 다시 저장하는 스크립트를 다음과 같이 완성.

library(multtest);

G <- list.files(".", pattern="*.pvalue.txt$")
print(length(G))
for (f in G){
    p <- scan(f, what=numeric(0));
    q <- mt.rawp2adjp(p, "TSBH");
    out_name = paste(f, ".qvalue.txt", sep="");
    write(length(p), out_name);
    write(q$h0.TSBH, out_name, append=TRUE);
    write(q$adjp, out_name, append=TRUE, ncolumns=2, sep="\t");
}

오래만에 겁나게 찾아다녔네... -.- 밥값을 했으니, 집에나 가자.