갈루아의 반서재

1. General

1) 코드에 코멘트 달기 - "#" 을 이용하여 아래와 같이 코멘트를 달 수 있다.

 

> load("~/myfirstRobjects.rdata", ex <- new.env()) #어쩌고 저쩌고
> ls.str(ex) # 코멘트 달기
savevector1 :  int [1:9] 1 2 3 4 5 6 7 8 9
savevector2 :  chr "Yay!"
>

 

"#"의 왼편에 위치한 코드만 실행된다.

코멘트가 중요한 이유는 여러분이 잊어버리지 않기 위해서도 중요하지만 여러분의 코드를 쓰는 다른 이들을 위해서도 중요하다는 점은 두말할 나위가 없다.

 

2) 하드 코드를 쓰지 말 것

예를 들어, 설사 길이가 변하지 않는다고 하더라도 벡터의 길이와 같은 하드 코드를 쓰지말고 length() 와 같은 함수를 이용해라.

아래 예제에서 2번 코드가 더 훌륭한 이유는 벡터의 길이를 변수로 받기 때문이다.

10보다 작은 값을 인풋한다고 해도 위와 같은 습관을 들이는 것이 좋다.

 

 예1. 나쁜 예

예2. 좋은 예

 sampleforloop <- function(inputvector) {

 for(i in 1:10) {

 inputvector[i] = i

 }

 }

 sampleforloop <- function(inputvector) {

 for(i in 1:length(inputvector)) {

 inputvector[i] = i

 }

 }

 

 

3) 한 자릿수의 변수 이름은 쓰지말 것

 

4) 변수 이름을 짧게 쓸 것

 (1) 간결하지만 명확하게 변수 이름을 붙일 것

 (2) 변수 이름을 숫자로 시작하지 말 것

 (3) " "(공백), "$" 은 변수 이름으로 쓰지 말 것 (하지만 "-" 은 괜찮다)

 

 

2. Matrix Multiplication

 

loop 를 피하고  행렬을 최대한 구사해야한다. R은 여러분이 수행하는 많은 계산들이 행렬의 곱을 다루고 있다는 데 기반해서 만들어졌다. 사소한 팁일수도 있지만 대량의 데이터 셋을 다루는데 있어서는 행렬의 곱을 사용하는 것과 "for" loop 구문을 사용하는데는 차이가 크다.  

 

1) 행렬의 곱으로 구현 

matrix1 = matrix(sample(c(0, 1), 100, replace = T), nrow = 10)

matrix2 = matrix(rnorm(100), nrow = 10)

matrix3 = matrix1%*%matrix2

 

 

2) "for" loop 구문으로 구현 

for(i in 1:length(matrix1[1,])) {

for(j in 1:length(matrix1[,1])) {

matrix3[i,j] = matrix1[j,]%*%matrix2[,i]

}

}

nested "for" loops 로 1) 과 같은 연산이 가능하지만 2) 의 경우가 훨씬 처리속도가 느리다.

 

 

3. Plan

실제 프로그래밍하는 시간보다 2배의 시간을 프로그램을 스케치하고 공식화하는데 투자해라. 물론 단순히 R 에만 적용되는 팁은 아니지만 말이다. 

 

4. Debug

코드를 디버그하는 것은 무척이나 짜증나는 일일 수 있지만, 좌절하지말고 프로그램의 처음부터 끝까지 찬찬히 살펴보라. 경우에 따라서는 종이와 펜을 준비해서 샘플 값을 넣어보고 각각의 단계에서 어떻게 결과치가 나오는지 살펴보는 것도 유용하다. 

 

디버깅에는 debug() 함수를 이용해보는 것도 좋다.  

 

> debug(functionname(input))

 

print() 함수를 추가해서 연산 실행 후 결과치를 확인해보는 것도 도움이 된다.

 

samplevector1 = samplevector1^2

print(samplevector1)

 

5. Help

온라인상의 다수의 R 포럼을 활용하는 것도 큰 도움이 될 수 있다. 

 

6. Packages

패키지 설치방법에 대해서는 다음에 다루기로 한다. 

유용한 패키지 모음 http://cran.r-project.org/web/packages/available_packages_by_name.html