경로 다루기
경로(path)는 파일의 위치를 말하는 것으로 디렉터리, 디렉터리와 서브 디렉터리와의 구분 기호, 파일 이름, 파일 확장자 등의 연결로 표시된다. 윈도우를 사용하는지, 맥이나 리눅스 등 유닉스 계열을 사용하는지에 따라서 경로를 표시하는 방법이 다르다. 유닉스 계열에서는 디렉터리와 서브디렉터리 사이를 /(포워드 슬래시)로 구분한다. 윈도우에서는 이런 포워드 슬래시도 사용 가능하지만 | (백워드 슬래시)도 쓸 수 있다.
이런 백워드 슬래시를 문자열 안에서 사용할 때는 이스케이핑해야 하기 때문에 ||을 사용해야 한다는 점을 주의하자.
R.home()함수는 R이 설치되어 있는 디렉터리를 알려준다. gerwd()는 현재 세션의 워킹 디렉터리 경로를 반환한다. setwd() 로 워킹 디렉터리를 바꿀 수 있다. .libPaths()는 R이 사용하는 라이브러리(패키지가 저장되어 있는 디렉터리)를 알려주거나, 커스텀 라이브러리를 추가할 수 있다. dir.create()이라는 함수를 사용하여 원하는 위치에 디렉터리도 만들 수 있다. 어떤 디렉터리가 존재하는지는 dir.exists()라는 함수를 사용할 수 있다.
if(!dir.exists("myDir")) dir.create("myDir")
file.path() 함수는 주어진 문자열을 이어 붙여서 파일에 대한 경로를 만든다.
> file.path("parent","child")
[1] "parent/child"
normalizePath() 함수는 운영체제에 따라서 경로를 표시하는 방법이 다른데, 현재 사용되는 시스템에 맞게 경로를 수정해준다.
[1] "C:\\Users\\dlckd\\Documents\\parent\\child"
떄로는 운영체제의 홈 디렉터리에 대해 ~표시로 대표되는 부분을 실제 절대 경로로 표시하고 싶은 경우가 있다. 이럴 때는 path.expand() 함수를 사용한다.
> path.expand("~")
[1] "C:\\Users\\dlckd\\Documents"
어떤 파일에 대한 전체 경로가 주어졌을 때, 이 경로에서 파일 이름만을 취할 때는 basename() 함수, 파일 이름을 제외한 경로명은 dirname() 으로 확인할 수 있다.
system.file() 함수로 컴퓨터에 설치된 R프로그램을 구성하는 시스템 파일에 접근할 수 있는데, 이 함수에 package 인자를 쓰면 해당 패키지가 저장된 파일에 접근할 수 있다. 다음은 샤이니 패키지에 있는 뉴스 파일에 대한 경로이다.
> shiny_news <- system.file("NEWS.md",package = "shiny")
> shiny_news
[1] "C:/Users/dlckd/Documents/R/win-library/3.6/shiny/NEWS.md"
이런 경로에서 파일 이름과 디렉터리는 다음과 같이 접근할 수 있다.
> basename(shiny_news)
[1] "NEWS.md"
> dirname(shiny_news)
[1] "C:/Users/dlckd/Documents/R/win-library/3.6/shiny"
파일을 다루는 함수들
어떤 디렉터리에 존재하는 파일 리스트를 보려면 list.files() 또는 dir() 함수를 사용한다.
> list.files(R.home())
[1] "bin" "CHANGES" "COPYING" "doc"
[5] "etc" "include" "library" "MD5"
[9] "modules" "README" "README.R-3.6.0" "share"
[13] "src" "Tcl" "tests" "unins000.dat"
[17] "unins000.exe"
> dir(R.home())
[1] "bin" "CHANGES" "COPYING" "doc"
[5] "etc" "include" "library" "MD5"
[9] "modules" "README" "README.R-3.6.0" "share"
[13] "src" "Tcl" "tests" "unins000.dat"
[17] "unins000.exe"
pattern 인자를 사용하여 특정 이름을 가진 파일들을 확인 할 수 있고, all.files 인자를 사용하여 히든 파일들을 볼 수도 있다.
이외의 다양한 옵션들은 ?list.files을 실행하여 도움말을 참고한다.
어떤 디렉터리에 파일이 존재하는지 확인하려면 file.exists() 함수를 사용한다.
> file.exists(R.home())
[1] TRUE
또 파일을 생성하는 file.create(..., showWarnings = TRUE) 함수가 있다. 현재의 워킹 디렉터리에 myExample.txt 라는 파일을 만드는 방법이다.
> file.create("myExample.txt")
[1] TRUE
다음은 현재의 디렉터리에 myExample.txt, myExample2.txt 파일을 생성한다.
> file.create("myExample1.txt","myExample2.txt")
[1] TRUE TRUE
# 또는 다음과 같이 문자열 벡터로 지정할 수 있다.
# file.create(c("myExample1.txt","myExample2.txt"))
그리고 파일을 삭제하는 file.remove() 함수와 unlink() 함수가 있다. 이둘은 거의 차이가 없다.
파일에 대한 정보를 읽는 함수
파일에 대한 정보는 크기, 마지막으로 수정된 시간, 권한 등등 아주 다양하다. 이런 정보들은 file.info()라는 함수로 확인 할 수 있다. 이 함수는 디렉터리, 파일에 대한 정보를 데이터 프레임으로 반환한다. 이 데이터 프레임에서는 행에 파일의 이름, 열에 그 파일에 대한 정보를 가지고 있다.
> head(file_info)
size isdir mode mtime ctime
9C96.tmp 5496832 FALSE 666 2019-07-17 21:29:53 2019-07-17 21:29:35
ABFE.tmp 5496832 FALSE 666 2019-07-18 21:55:23 2019-07-18 21:54:59
C1A6.tmp 5496832 FALSE 666 2019-07-17 21:19:03 2019-07-17 21:18:50
desktop.ini 402 FALSE 666 2019-07-17 21:24:44 2019-03-19 13:32:59
League of Legends 0 TRUE 777 2019-06-23 19:39:30 2019-06-23 19:39:30
MOP 0 TRUE 777 2019-07-23 02:05:07 2019-06-09 22:35:58
atime exe
9C96.tmp 2019-07-17 21:29:53 no
ABFE.tmp 2019-07-18 21:55:23 no
C1A6.tmp 2019-07-17 21:19:03 no
desktop.ini 2019-07-17 21:24:44 no
League of Legends 2019-06-23 19:39:30 no
MOP 2019-07-23 02:05:07 no
자세한 정보는 함수의 도움말을 확인한다. 여기에 시간과 관련된 mttime,ctime,atime 등이 있는데, 샤이니 앱들을 보면 mtime을 쓰는 경우가 많다. mtime은 최종 수정된 시간을 말하며, file.mtime() 함수로도 접근 할 수 있다. 샤이니 용어로 표현하자면 '샤이니에서 세션 간에 데이터를 공유하기 위해서, 샤이니 코드 밖에 데이터 파일을 두고, 이 파일의 내용이 바뀌는 것을 무효화하는 신호로 사용하려고 할 때' file.mtime() 함수를 사용할 수 있다.
임시 디렉터리와 파일
R 세션이 시작되면 이 세션과 관련된 임시 디렉터리가 생성되고, R 세션이 종료되면 이 임시 디렉터리는 삭제된다. 이 디렉터리는 tempdir() 함수로 확인 할 수 있다. 그리고 이 디렉터리에 tempfile() 이라는 함수를 사용하여 파일을 생성할 수 있는데, 이 함수 자체는 임시 파일의 이름만 반환한다. 따라서 파일을 만들려면 file.create() 라는 함수를 사용해야 한다.
다음은 임시 디렉터리 경로이다.
> tempdir()
[1] "C:\\Users\\dlckd\\AppData\\Local\\Temp\\RtmpqufwA8"
이 디렉터리에 tmp1 이라는 파일을 만들려면 다음과 같이 하여야 한다.
> tmp1 <- tempfile(fileext = ".png")
> file.create(tmp1)
[1] TRUE
이런 임시 디렉터리는 R세션이 종료되면 사라진다. 샤이니 앱에서는 파일 업로드, 파일 다운로드, 이미지를 처리하는 과정에서 이런 임시 디렉터리와 임시 파일이 중요하게 사용된다.
'전공 > R프로그래밍' 카테고리의 다른 글
R프로그래밍 22. R 세션과 options() (2) | 2019.08.19 |
---|---|
R프로그래밍 21. 샤이니에서 유용한 함수들 (0) | 2019.08.16 |
R프로그래밍19. 비표준 평가(non-standard evaluation)와 탈출구(escape hatch) (0) | 2019.08.08 |
R프로그래밍 18. 표현식의 사용 (0) | 2019.08.07 |
R프로그래밍 17. 느긋한 평가 조급한 평가 (0) | 2019.08.06 |