변수(Variables)
R의 변수
R의 변수는 동적 타입이다: 변수의 타입이 프로그램의 실행 도중에 바뀔 수 있다.
숫자, 문자, 분석 결과 등을 모두 R의 객체(Object)에 담을 수 있다.
이 책에서는 변수와 객체라는 용어를 혼용한다. 보통 변수는 하나의 수를 저장할 수 있고 객체는 더 큰 데이터 구조와 함수 등을 저장한다. 하지만 변할 수 있는 무엇(수, 문자열, 함수 등)을 담는다는 의미에서 공통적이다.
변수의 이름
myAge = 22
year = 2018
day_of_Month = 3 # Alphabets , numbers , '.', '_'
stock.high = 13322
whatIGotForMy23thBirthday = "flowers"
- 변수이름은 알파벳, 숫자,
.
과_
을 활용할 수 있다. - 하지만 변수 이름의 첫 문자가 숫자 또는
_
(underbar)가 될 수는 없다. - 변수 이름이
.
(마침표)로 시작할 경우에 두 번째 문자는 숫자가 될 수 없다. (.2
라는 변수이름은 숫자.2
와 구분할 수 없다!) - 첫문자
.
는 R의 내부 동작을 위해 필요한 변수 이름으로 많이 쓴다. - 사용 가능한 변수 이름을 모두 표시하기 위해서는
ls()
을 사용한다. (하지만 첫문자가.
로 시작하는 변수는 제외된다.) - 만약 첫문자가
.
로 시작하는 변수도 모두 표시하기 위해서는ls(all.names=TRUE)
를 활용한다. - 알파벳의 경우 대문자와 소문자를 구분한다.
- 한글판의 경우 한글도 가능하다!
- 이름 잘 짓는 것은 생각보다 쉽지 않다.[var1]
- 변수 이름을 지을 때 고려할 점은 다음과 같다.
- 이미 사용되고 있는 이름은 아닌가?
- R의 예약어는 아닌가? (예약어에 대한 설명은 다음 장을 참고하라.)
- 앞에서 얘기한 R의 변수 이름 제약 조건을 따르고 있는가?
- R의 예약어가 아니면서 R의 변수 이름 제약 조건을 따르는 변수 이름을 만들고 싶다면
make.names("")
함수를 활용하는 것도 한 방법이다.
[var1]: 오죽하면 이런 농담도 있지 않은가? There are only two hard things in Computer Science: cache invalidation and naming things.
변수 할당
# Assign
a <- 3
b = 2
-1 -> d
e1 <- e2 <- 7
assign("var1", 3)
varname = "myVariable" # Camel case
assign(varname , 2)
# Naming Convention
myVariable = 1 # Camel case/Pascal case
varname2 = "my_Another_Variable" # Python
varname3 = "myVariable.3rd" # R
assign(varname2 , 2)
assign(varname3 , 2)
변수에 어떤 값을 할당(assign)하기 위해서는 <-
, ->
또는 =
을 사용한다. <-
, ->
, =
는 하나의 값을 여러 변수에 할당하기 연속해서 쓸 수 있다.
e2 <- e1 <- 7
e1 = e2 = 7
7 -> e1 -> e2
할당의 결과는 화면에 출력되지 않지만, ()
안에 넣으면 출력이 된다.[v1]
e1 * 3
## [1] 21
d1 <- e1 * 3
(d2 <- e1 * 3)
## [1] 21
[v1]: 콘솔에서 실행할 경우에 출력이 되며, 스크립트로 실행되면 출력되지 않는다. 덧붙여 ;
를 사용하면 한 행에서 여러 할당을 실행할 수 있다(예. e1=1; e2=2
).
변수 이름이 다른 변수에 담겨 있을 경우에는 assign
함수를 사용한다.[var02]
컴퓨터 과학에서는 변수의 이름을 짓는 몇 가지 관례가 있다.
- camelCase(낙타방법) :
myVariable
처럼 여러 단어로 구성된 변수 이름에서 단어의 첫 문자를 대문자로 하는 방법 - snake_case(밑줄방법) :
my_varialbe
처럼 변수이름이 여러 단어로 구성된 경우, 단어를_
로 연결한다. 파이썬에서 많이 쓰는 방법이다. - R의 경우에는 변수 이름에
.
을 쓸 수 있다. 그래서 전통적으로 R의 변수 이름에는.
를 자주 볼 수 있었다.my.variable
과 같이 쓰는 것이다. 하지만 R의 변수 이름 짓는 방법에 통일된 방법이 있는 것은 아니다. 어떤 사람은 camelCase를 쓰기도 하고, 다른 사람들(예. Hadley)은 snake_case를 지지한다. 특히 R의 기본 함수의 경우에도 통일된 방법이 없다. 대표적으로Sys.Date()
함수와Sys.time()
함수를 비교해보자.Sys.Date()
의D
는 대문자이고,Sys.time()
의t
는 소문자이다.
[var02]: 이 책에서는 의식적으로 변수이름을 직접 사용하는 경우와 변수이름이 문자열 변수에 저장되어 있는 경우를 모두 다루려고 하였다. 첫 번째 읽을 때에는 변수이름을 사용하는 경우만 봐도 무방할 것이다. 하지만 프로그래밍을 하는 연수가 늘어날수록 변수이름이 문자열 변수에 저장되어 있는 상황에 맞닦드리게 된다.
변수 관리
현재 모든 변수를 제거하려면 rm(list=ls())
를 사용한다. (이때 .
으로 시작하는 변수는 제외된다.)
rm(list=ls())
현재 저장된 모든 변수를 나열하려면 ls()
를 사용한다.
a = 2; b = function(x) x^2; cc = "Now"
ls()
## [1] "a" "b" "cc"
특정한 변수의 데이터 구조(structure)를 알아보려면 str()
함수를 사용한다.[var03]
str(a); str(b); str(cc);
## num 2
## function (x)
## - attr(*, "srcref")= ' srcref ' int [1:8] 2 12 2 26 12 26 2 2
## ..- attr(*, "srcfile")=Classes ' srcfilecopy ' , ' srcfile ' <environ...
## chr "Now"
ls.str()
는 ls()
의 결과에 str()
를 적용했다고 생각할 수 있다. 변수의 이름을 나열하고, 저장된 데이터의 타입과 구조, 내용을 보여준다(<
데이터 구조>
장 참조).
ls.str()
## a : num 2 ## b : function (x) ## cc : chr "Now"
이름이 a
인 변수가 존재하는지 확인하기 위해서는 exists("a")
를 사용한다.
exists("a"); exists("d")
## [1] TRUE ## [1] TRUE
변수를 제거하려면 rm
함수를 사용한다.
ls() # 현재 저장된 변수 이름을 보여준다.
rm("a") # 변수 a를 제거한다.
ls() # 변수 a가 제거되었음을 확인한다.
rm(list=ls()) # 모든 변수를 제거한다.
ls() # 모든 변수가 제거되었음을 확인한다.
만약 함수를 제외한 모든 객체를 제거하려면 다음과 같다.
rm(list = setdiff(ls(), lsf.str()))
현재 메모리 상의 모든 객체를 저장하려면 save.image()
를 사용한다.[var04]
save.image()
저장된 내용을 다시 불러오려면 load('.RData')
를 사용한다.[var05]
load('.RData')
정리 {-}
함수 | 기능 |
---|---|
ls() |
모든 객체 나열(. 로 시작하는 객체 제외) |
rm(list=ls()) |
모든 객체 제거(. 로 시작하는 객체 제외) |
rm(setdiff(ls(), lsf.str())) |
함수를 제외한 모든 객체 제거 |
str(x) |
객체 x 의 데이터 구조 |
ls.str() |
ls() + str() |
exists('x') |
객체 x 의 존재 여부 확인 |
rm(x) 또는 rm('x') |
객체 x 제거 |
save.image() |
모든 객체 저장 |
load('.RData') |
.RData 에 저장된 객체 불러오기 |
[var03]: 많은 사람들이 str()
함수를 잘못 이름 지어진 사례의 하나로 뽑는다. 왜냐하면 대부분의 컴퓨터 언어에서 str
은 string(문자열)과 관련된 예약어 또는 함수이기 때문이다.
[var04]: Rstudio를 종료할 때에도 save.image()
를 통해 메모리 상의 모든 객체가 저장된다. Rstudio-Options-General-Save workspace to .RData on exit에서 Always(항상저장)/Never(저장하지 않음)/Ask(답변에따라) 중 하나를 선택할 수 있다.
[var05]: Rstudio를 시작할 때에도 load('.RData')
가 실행된다. RStudio – Options – General – Restore .RData into workspace at startup의 체크를 제거함으로써 load('.RData')
가 RStudio가 실행될 때마다 실행되지 않도록 할 수 있다.
Leave a comment