이 절에서는 R 콘솔에서는 거의 사용하지는 않지만 프로그래밍 할 때 유용한 함수들을 몇가지 소개한다. 아주 간단한 문제인데 프로그래밍 할 때는 중요할 수도 있다.
R 콘솔에서 37이라는 값을 객체 x에 할당하려면 어떻게 할까? 당연히 다음과 같이 한다.
> x <- 37
> x
[1] 37
여기에서 x라는 이름이 기존에 존재하지 않고, 프로그래밍 방식으로 다이내믹하게 생성되는 이름이라면 이 코드를 그대로 쓸 수 없다. 예를들어 1에서 10까지 반복하면서 vs라는 문자열 벡터에 "x1","x2",---,"x10" 이라는 요소들을 생성하고, 이들의 이름에 각각 1에서 10까지 값을 할당해보자. 즉 x1 객체에는 1, x2 객체에는 2 등을 할당하는 것이다.
> for(i in 1: 10){
+ vs <- paste0("x",i)
+ assign(vs,i)
+ }
> x1
[1] 1
> x2
[1] 2
> x3
[1] 3
이러한 방법은 생각보다 까다로울 수 있는데, 이런 경우에는 함수가 assign() 함수를 사용하면 된다.
이 assign(이름, 값)의 형태로 사용하는데, 현재 환경에서 이름에 대한 값을 바인딩 하게 만든다.
paste() 명령어
> paste("abc","def","ghi")
[1] "abc def ghi" #중간에 띄어쓰기가 포함되어 있음
> paste0("abc","def","ghi")
[1] "abcdefghi" #paste0은 띄어쓰기 되지 않되어 있음
> paste("abc","def","ghi",sep = "()")
[1] "abc()def()ghi" #sep 조건을 넣으면 띄어쓰기 아닌 것을 포함 가능
> paste0("abc","def","ghi",sep = "()")
[1] "abcdefghi()" #paste0은 sep 조건을 넣어도 뒤에 추가가 될 뿐임
이제 앞의 코드에서 R콘솔에서처럼 그 값을 확인하기 위해서 x1,x2,x3 등으로 이름을 입력하여 그 값을 출력하게 만들었다. 이것을 프로그래밍 방식으로 하려면 어떻게 할까? 다음과 같이 get(이름) 함수를 사용한다.
> for(i in 1:10){
+ vs <- paste0("x",i)
+ assign(vs,i)
+ print(get(vs))
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
이런 함수들은 샤이니의 selectInput() 입력 위젯에서 어떤 것을 선택하고, 선택한 그 이름을 가진 R 데이터셋을 얻을 때 유용하게 사용된다. 이런 입력위젯의 값은 input$sel 로 전달되는데, 이것은 샤이니 서버 함수에서 텍스트로 사용된다. 객체의 이름이 아닌 것이다. 만약 이것이 "mtcars"가 된다면 샤이니 서버 함수에서 get("mtcars") 를 통해서 R 객체를 가지고 올 수 있다.
switch() 는 원시함수(primitive function)의 하나인데 다음과 같이 사용한다.
> switch(statement,list)
> x <- 3
> switch(x,2+2,mean(1:10),rnorm(5))
[1] 2.5973325 -0.8311612 1.2482219 0.4832344 0.8636519
첫 번째 인자인 statement가 어떤 값으로 평가되는지에 따라서 사용법이 달라진다.
먼저 숫자인 경우에는 list 부분의 숫자에 해당하는 순번에 있는 표현식을 실행한다. 만약 리스트의 개수 범위를 넘어서면 NULL 값을 반환한다. 위는 x가 3의 값이므로 세 번째 표현식 rnorm(5)를 평가한 것이다.
statement가 문자인 경우에는 list의 이름들을 조회하여 정확히 매칭되는 이름에 할당되는 표현식이 실행된다.
부분적으로 매칭되는 것은 허용하지 않는다. 다음 예를 보자. Type에 어떤 문자열이 할당되면, 할당된 그 문자열을 이름(name)으로 가지는 표현식을 찾아서 실행한다.
> center <- function(x,type){
+ switch(type,
+ mean = mean(x),
+ median = median(x),
+ trimmed = mean(x,trim=.1))
+ }
> x <- rcauchy(10)
> x
[1] 1.11496483 -3.98568123 0.70965223 0.03549094 2.35707824 0.07490135
[7] 0.65180795 0.27310808 -0.09401917 -0.61828971
> center(x,"mean")
[1] 0.05190135
> center(x,"median")
[1] 0.1740047
샤이니 앱에서는 사용자가 선택한 값에 따라서 다른 계산을 하게 할 필요가 자주 생기는데, switch() 함수를 사용하면 간결하게 코딩을 할 수 있다.
'전공 > R프로그래밍' 카테고리의 다른 글
R프로그래밍 23. 코드 실행 과정과 앱의 상태 (0) | 2019.08.20 |
---|---|
R프로그래밍 22. R 세션과 options() (2) | 2019.08.19 |
R프로그래밍 20. R에서 파일 다루기 (0) | 2019.08.14 |
R프로그래밍19. 비표준 평가(non-standard evaluation)와 탈출구(escape hatch) (0) | 2019.08.08 |
R프로그래밍 18. 표현식의 사용 (0) | 2019.08.07 |