R FAQ (translated in Korean)

center;">Version 3.2.2015-08-09

Kurt Hornik


Table of Contents

R FAQ (translated in Korean)


1 소개

이 문서는 R에 관하여 가장 많이 자주 물어보는 질문들에 대해서 정리한 문서입니다.


1.1 법률적 사항(Legalese)

이 문서(영문)에 대한 저작권은 © 1998–2015 Kurt Hornik에게 있습니다 (한국어 번역본은 Chel Hee Lee © 2009–2015에 있습니다).

본 문서는 자유소프트웨어(free software)이므로, 자유소프트웨어 재단 (Free Software Foundation)에 의해서 배포되는 GNU 일반공중라이센스 (General Public License) 버전 2 또는 그 이후의 버전들을 통하여 수정 및 재배포를 할 수 있습니다.

이 문서가 사용자에게 유용하길 바라는 희망에서 배포되고 있습니다. 그러나, 어떤 상업적 형태(MERCHANTABILITY)로서의 보증 및 특수한 목적에 적합(FITNESS FOR A PARTICULAR PURPOSES)등 어떠한 형태의 보증을 하지 않습니다. 보다 자세한 사항들은 GNU 일반공증라이센스를 참조하시길 부탁드립니다.

GNU 일반공증라이센스의 사본들을 아래의 주소로부터 찾으실 수 있습니다.

https://www.R-project.org/Licenses/

1.2 이 문서를 얻는 방법

가장 최신 버전의 문서는 항상 아래의 주소에서 확인이 가능합니다.

https://CRAN.R-project.org/doc/FAQ/

From there, you can obtain versions converted to plain ASCII text, GNU info, HTML, PDF, as well as the Texinfo source used for creating all these formats using the GNU Texinfo system.

그외에도 R FAQ 문서를 CRAN 사이트 (see CRAN이란 무엇인가요? 참조)의 하위디렉토리 doc/FAQ에서 찾을 수 있습니다.


1.3 이 문서를 인용하는 방법

퍼블리케이션 (publication)에서 본 FAQ 문서를 인용하고자 할 때에는 Hornik (2015), “The R FAQ” 이라고 해주시고, 위에서 언급한 공식적인 URL을 기재해 주세요.

@Misc{,
  author        = {Kurt Hornik},
  title         = {{R} {FAQ}},
  year          = {2015},
  url           = {https://CRAN.R-project.org/doc/FAQ/R-FAQ.html}
}

1.4 표기법(Notation)

이 문서에서는 거의 대부분이 표준에 가까운 표기법을 사용합니다. 예를들면, ‘R>’은 R 프롬프트(prompt)를 나타내고, ‘$’는 쉘프롬프트(shell prompt)를 의미합니다.


1.5 피드백(Feedback)

본 문서에 대한 피드백을 Kurt.Hornik@R-project.org로 보내주신다면 더할 나위 없이 감사드리겠습니다 (한국어 문서에 대한 피드백은 chl948@mail.usask.ca으로 보내주시길 부탁드립니다).

In particular, note that I do not have access to Windows or Mac systems. Features specific to the Windows and OS X ports of R are described in the “R for Windows FAQ and the “R for Mac OS X FAQ. If you have information on Mac or Windows systems that you think should be added to this document, please let me know.


2 R 기초


2.1 R이란 무엇인가요?

R은 통계 계산 (statistical computation)과 그래픽 (graphics)를 위한 시스템입니다. 이것은 언어(language), 그래픽을 사용하는 실행환경 (run-time environment), 디버거(debugger), 특정시스템 함수들에 대한 접근, 그리고 스크립트 파일들에 저장되어 있는 프로그램들을 실행시키는 요소들로 구성되어 있습니다.

R의 디자인은 Becker, Chambers & Wilks의 S (see S란 무엇인가요?)와 Sussman의 Scheme으로부터 크게 영향을 받았습니다. 결과적으로 보이는 언어는 S의 외형과 매우 흡사하지만, 근본적인 구현방법과 시맨틱스(sematics)는 Scheme으로부터 유래되었습니다. 더 많은 내용을 알고 싶으시다면 See R과 S 사이에 다른 점이 있나요?를 참고하시길 바랍니다.

R의 핵심은 인터프리트된 컴퓨터 언어 (interpreted computer language)입니다. 이것은 분기(branching), 루핑(Looping) 그리고 함수(functions)를 이용한 모듈(modular) 프로그래밍을 가능하게 합니다. R에서 사용자가 사용하는 함수들의 대부분은 R로 작성되었습니다. 또한, 사용자가 효율성(efficiency)를 위한 목적으로 C, C++, 또는 FORTRAN과 같은 언어로 작성된 프로시져들에 인터페이싱(interface)하는 것이 가능합니다. R 배포판 (distribution)은 방대한 양의 통계적 프로시져(statistical procedure)들을 위한 기능(functionalities)들을 포함하고 있습니다. 이들중에는 선형 및 일반화 선형 모델 (linear and generalized linear models), 비선형모델 (nonlinear regression model), 시계열분석 (time series analysis), 전통적인 모수 및 비모수 테스트 (classical parametric and nonparametric tests), 클러스터링 (clustering)과 평활화 (smoothing)이 있습니다. 또한 매우 다양한 종류의 데이터 시각적 표현들을 생성할 수 있는 매우 유연한 그래픽 환경을 제공해주는 방대한 양의 함수들의 집합이 있습니다. 특수한 목적을 달성하기 위해서 개발된 애드온 패키지(“add-on packages”)로 알려져 있는 부가적인 모듈들 역시 이용이 가능합니다. (이들에 대해서 더 알고 싶으시면 see R Add-On Packages를 참고해주세요).

최초의 R은 Ross IhakaRobert Gentleman가 New Zealand의 Auckland 에 있는 University of Auckland의 통계학과에 재직중일 당시 작성되었습니다. 그 이후, 많은 사용자들이 코드를 제공하고 버그를 리포팅 함으로서 R에 기여 해왔습니다.

1997년 중반 이래로 “R Core Team”이라는 이름의 그룹에 의해서 R의 소스 코드 아카이브를 수정 및 관리되어지고 있습니다. 이 그룹은 Doug Bates, John Chambers, Peter Dalgaard, Seth Falcon, Robert Gentleman, Kurt Hornik, Stefano Iacus, Ross Ihaka, Friedrich Leisch, Uwe Ligges, Thomas Lumley, Martin Maechler, Duncan Murdoch, Paul Murrell, Martyn Plummer, Brian Ripley, Deepayan Sarkar, Duncan Temple Lang, Luke Tierney, Simon Urbanek 으로 구성되어 있습니다.

R has a home page at https://www.R-project.org/. It is free software distributed under a GNU-style copyleft, and an official part of the GNU project (“GNU S”).


2.2 R은 어떤 플랫폼에서 사용가능한가요?

R은 Unix, Windows와 Mac 계열의 환경에서 개발되어져 왔습니다. R 1.7.1 이후로는 Mac OS Classic 에 대한 지원이 종료되었습니다.

The current version of R will configure and build under a number of common Unix-like (e.g., https://en.wikipedia.org/wiki/Unix-like) platforms including cpu-linux-gnu for the i386, amd64, alpha, arm/armel, hppa, ia64, m68k, mips/mipsel, powerpc, s390 and sparc CPUs (e.g., https://buildd.debian.org/build.php?&pkg=r-base), i386-hurd-gnu, cpu-kfreebsd-gnu for i386 and amd64, powerpc-apple-darwin, mips-sgi-irix, i386-freebsd, rs6000-ibm-aix, and sparc-sun-solaris.

혹시 다른 플랫폼을 알고 계시다면, 저희에게 알려주십시요.


2.3 현재 배포된 R의 버전은 무엇인가요?

현재 발표된 (released) 버전은 3.2.2입니다. ‘major.minor.patchlevel’의 형식을 가지는 번호체계(numbering scheme)에 기초하여, R은 두 개발버전 (development version)들과 현재 발표된 버전의 일부를 수정한 ’r-patched’라는 이름의 패치된 버전이 있으며, 다음 단계의 마이너(minor) 버전 또는 결과적으로는 주버전(major)이 될 ‘r-devel’라는 이름으로 발표된 R이 있습니다. 패치 버전 (r-patched)은 대개 버그 수정을 한 것입니다. 새로운 기능 및 형상들은 일반적으로 r-devel 에서 소개됩니다.


2.4 어떻게 R을 얻을 수 있나요?

R 원시코드 (sources), 바이너리 (binaries), 그리고 문서들(documentation)은 CRAN(“Comprehensive R Archive Network”)을 통하여 얻을 수 있습니다. (CRAN이란 무엇인가요?을 살펴보세요).

원시코드 (sources)는 또한 R 서브버전 저장소 (subversion repository)인 https://svn.R-project.org/R/를 통하여 얻을 수 있습니다. 그러나, 익명 rsync (그리고 CVS)를 사용할 수 없습니다.

Tarballs with daily snapshots of the r-devel and r-patched development versions of R can be found at https://stat.ethz.ch/R/daily.


2.5 R의 설치는 어떻게 하나요?


2.5.1 어떻게 R을 설치하나요? (유닉스와 같은 환경)

만약 R이 이미 설치되어 있다면, 쉘 프롬프트(shell prompt)에서 R이라고 입력을 함으로서 실행할 수 있습니다 (물론, 실행가능한 파일이 경로에 올바르게 위치해 있다는 가정하에서 입니다).

만약 사용자의 플랫폼에 바이너리(binaries)가 사용가능하다면 (R을 유닉스와 같은 환경에서 사용할 수 있도록 바이너리 파일이 제공되나요? 섹션을 살펴보세요), 이와 함께 제공되는 지시사항들을 따른다면 이들을 사용할 수 있습니다.

그렇지 않다면, R을 직접 컴파일하여 설치하여야 합니다. 일반적인 Unix와 같은 플랫폼(R은 어떤 플랫폼에서 사용가능한가요?를 참고해주세요)에서 이 과정을 수행하는 것은 매우 쉽쉽니다. R의 배포판과 함께 제공되는 INSTALL 파일은 간단한 설치지침을 포함하고 있으면 “R Installation and Administration”라는 가이드는 설치와 관련한 자세한 내용들이 잘 문서화 되어 있습니다 (see What documentation exists for R?을 참고하세요).

참고로 R을 빌드(build)하기 위해서는 C 컴파일러(compiler) 외에도 FORTRAN 컴파일러 혹은 아마도 f2c라는 것이 필요할 수도 있습니다.

가장 간단한 방법은 R 원시코드(source code)의 압축을 풀고, 압축이 풀어 생성된 디렉토리로 이동한 후, (쉘 프롬프트상에서) 다음과 같은 명령어를 입력하는 것입니다.

$ ./configure
$ make

만약 명령어들이 성공적으로 수행된다면, R 바이너리와 쉘 스크립트로 작성된 사용자가 이용이 가능한 R이라는 이름을 가진 파일이 생성되고, 이는 bin 디렉토리에 복사되어 질 것입니다. 사용자는 이 스크립트를 실행시키고자 하는 위치로 스크립트를 복사해 넣기만 하면 됩니다. 예를들면, /usr/local/bin 디렉토리입니다. 또한, 텍스트로만 구성된 도움말 페이지 뿐만아니라 HTML, LaTeX 버전의 문서들도 함께 설치됩니다.

doc/manual에 놓여있는 refman.dvi (R object reference index) 혹은 R-exts.dvi (“R Extension Writers Guide”)와 같은 R 매뉴얼들의 DVI 버전을 생성하기 위해서는 make dvi를 이용해보세요. 이러한 파일들은 xdvi 또는 dvips와 같은 표준 프로그램들을 이용하여 미리 보거나 프린트를 할 수 있습니다. 또한, make pdf의 사용은 매뉴얼들을 PDF (Portable Document Format)의 형식으로 생성하게 해줍니다. 이들은 Arobat을 이용하여 볼 수 있습니다. GNU Texinfo 시스템에 의하여 작성된 매뉴얼들 (본 한국어 매뉴얼 역시 GNU Texinfo 시스템을 이용하여 작성되었습니다) 은 또한 Emacs 또는 독립적인 GNU Info 와 함께 온라인으로 읽을 수 읽을 수 있도록 info 파일들로 변환할 수 있습니다. 이들을 생성하기 위해서는 make info를 이용하시길 바랍니다. (단, 이경우에는 Makeinfo 의 버전이 4.5 이상이 요구됩니다).

마지막으로 R 시스템이 정상적으로 작동하는지 확인하기 위해서 make check를 이용해 보세요.

make install을 이용하여 “system-wide”(시스템 전체에서 사용이 가능한) 설치를 수행할 수도 있습니다. 기본적으로 이것은 다음의 디렉토리에 설치됩니다.

${prefix}/bin

사용자가 직접 이용하는 쉘 스크립트

${prefix}/man/man1

man 페이지

${prefix}/lib/R

위의 내용을 제외한 나머지 모두 (라이브러리, 온라인 도움말, …)이 이곳에 설치됩니다. 이것을 설치된 시스템의 “R Home Directory”(R 홈디렉토리, R_HOME)이라고 합니다.

위에서 prefix는 환경설정을 하는 동안에 결정되어 지며 (일반적으로 /usr/local/입니다), 아래에 보이는 것과 같이 configure에 옵션을 이용하여 설치시에 정할 수도 있습니다.

$ ./configure --prefix=/where/you/want/R/to/go

(즉, R의 실행파일들은 /where/you/want/R/to/go/bin에 설치될 것입니다).

DVI, info, PDF 버전의 매뉴얼들을 설치하기 위해서는 make install-dvi, make install-info, make install-pdf을 각각 실행시키세요.


2.5.2 어떻게 R을 설치하나요? (윈도우즈 환경)

CRAN 사이트의 bin/windows 디렉토리는 ix86 과 x86_64 칩상에서 돌아가는 Windows 2000 과 그 이후 의 버전들 (64비트 포함)에서 돌아갈 수 있는 R base 배포판과 방대한 양의 애드온(add-on) 패키지들에 대한 바이너리들을 포함하고 있습니다. Windows 버전의 R은 Robert Gentleman과 Guido Masarotto에 의해서 만들어졌으며, 현재는 Duncan MurdochBrian D. Ripley에 의해서 개발 및 유지보수가 되고 있습니다.

대부분의 경우, Windows 설치 프로그램 (installer)은 이용하기에 가장 쉬운 도구일 것입니다.

See the “R for Windows FAQ for more details.


2.5.3 어떻게 R을 설치하나요? (Mac)

The bin/macosx directory of a CRAN site contains a standard Apple installer package to run on OS X 10.6 (‘Snow Leopard’) and later. Once downloaded and executed, the installer will install the current release of R and an R.app OS X GUI. This port of R for OS X is maintained by Simon Urbanek (and previously by Stefano Iacus). The “R for Mac OS X FAQ has more details.

R 의 r-patched 와 r-devel 버전들은 http://r.research.att.com 에서 Apple 인스톨러 패키지 형식으로 찾을 수 있습니다.


2.6 R을 유닉스와 같은 환경에서 사용할 수 있도록 바이너리 파일이 제공되나요?

CRAN 사이트의 bin/linux 디렉터리는 다음과 같은 패키지들을 담고있습니다.

CPUVersionsProvider
Debiani386/amd64squeeze/wheezyJohannes Ranke
armelwheezyJohannes Ranke
Ubuntui386/amd64lucid/precise/trustyMichael Rutter

Debian packages, maintained by Dirk Eddelbuettel, have long been part of the Debian distribution, and can be accessed through APT, the Debian package maintenance tool. Use e.g. apt-get install r-base r-recommended to install the R environment and recommended packages. If you also want to build R packages from source, also run apt-get install r-base-dev to obtain the additional tools required for this. So-called “backports” of the current R packages for at least the stable distribution of Debian are provided by Johannes Ranke, and available from CRAN. See https://CRAN.R-project.org/bin/linux/debian/README.html for details on R Debian packages and installing the backports, which should also be suitable for other Debian derivatives. Native backports for Ubuntu are provided by Michael Rutter.

R binaries for Fedora, maintained by Tom “Spot” Callaway, are provided as part of the Fedora distribution and can be accessed through yum, the RPM installer/updater. Note that the “Software” application (gnome-software), which is the default GUI for software installation in Fedora 20, cannot be used to install R. It is therefore recommended to use the yum command line tool. The Fedora R RPM is a “meta-package” which installs all the user and developer components of R (available separately as R-core and R-devel), as well as R-java, which ensures that R is configured for use with Java. The R RPM also installs the standalone R math library (libRmath and libRmath-devel), although this is not necessary to use R. When a new version of R is released, there may be a delay of up to 2 weeks until the Fedora RPM becomes publicly available, as it must pass through the statutory Fedora review process. RPMs for a selection of R packages are also provided by Fedora. The Extra Packages for Enterprise Linux (EPEL) project (https://fedoraproject.org/wiki/EPEL) provides ports of the Fedora RPMs for RedHat Enterprise Linux and compatible distributions (e.g., Centos, Scientific Linux, Oracle Linux).

See https://CRAN.R-project.org/bin/linux/suse/README.html for information about RPMs for openSUSE.

공개적으로 CRAN 을 통해 사용가능한 다른 바이너리 배포판은 없습니다.


2.7 What documentation exists for R?

R에서 사용할 수 있는 대부분의 함수들과 변수들에 대해서는 온라인 문서가 있으며, 이들은 R 프롬프트에서 help(name) (또는 ?name)이라고 입력함으로서 스크린을 통하여 확인할 수 있습니다. 여기에서 name은 도움을 받고자 하는 주제를 의미합니다. (단항과 이항 연산자 (unary and binary operators), 그리고 분기문(control-flow)과 같은 특수한 형태의 경우에는 검색어를 입력할때 따옴표를 함께 넣어주어야 할 수도 있습니다).

This documentation can also be made available as one reference manual for on-line reading in HTML and PDF formats, and as hardcopy via LaTeX, see ‘How can R be installed?’. An up-to-date HTML version is always available for web browsing at https://stat.ethz.ch/R-manual/.

일부 버전들에 대한 참고매뉴얼 (R reference manual)들은 Network Theory Ltd http://www.network-theory.co.uk/R/base/에서 구매할 수 있습니다. 매뉴얼 한 부가 판매될 때마다, 출판사는 R Foundation (see R 재단(Foundation)은 무엇을 말하나요?)에 USD 10 (미국돈으로 10달러)를 기부합니다.

R은 다음과 같은 매뉴얼들과 함께 배포되고 있습니다.

R과 관련된 문헌(publications)들에 대한 정보는 BibTeX 형식으로 아래의 주소에서 찾아 볼 수있습니다.

https://www.R-project.org/doc/bib/R.bib

R 코어팀 멤버들에 의해서 씌여진 책들은 아래와 같습니다.

John M. Chambers (2008), “Software for Data Analysis: Programming with R”. Springer, New York, ISBN 978-0-387-75935-7, https://statweb.stanford.edu/~jmc4/Rbook/.

Peter Dalgaard (2008), “Introductory Statistics with R”, 2nd edition. Springer, ISBN 978-0-387-79053-4, http://publicifsv.sund.ku.dk/~pd/ISwR.html.

Robert Gentleman (2008), “R Programming for Bioinformatics”. Chapman & Hall/CRC, Boca Raton, FL, ISBN 978-1-420-06367-7, https://www.bioconductor.org/pub/RBioinf/.

Stefano M. Iacus (2008), “Simulation and Inference for Stochastic Differential Equations: With R Examples”. Springer, New York, ISBN 978-0-387-75838-1.

Deepayan Sarkar (2007), “Lattice: Multivariate Data Visualization with R”. Springer, New York, ISBN 978-0-387-75968-5.

W. John Braun and Duncan J. Murdoch (2007), “A First Course in Statistical Programming with R”. Cambridge University Press, Cambridge, ISBN 978-0521872652.

P. Murrell (2005), “R Graphics”, Chapman & Hall/CRC, ISBN: 1-584-88486-X, https://www.stat.auckland.ac.nz/~paul/RGraphics/rgraphics.html.

William N. Venables and Brian D. Ripley (2002), “Modern Applied Statistics with S” (4th edition). Springer, ISBN 0-387-95457-0, https://www.stats.ox.ac.uk/pub/MASS4/.

Jose C. Pinheiro and Douglas M. Bates (2000), “Mixed-Effects Models in S and S-Plus”. Springer, ISBN 0-387-98957-0.

마지막으로, 최근의 것은 아니지만, Ross와 Robert가 R을 디자인하고 구현하면서 겪은 경험이 다음의 문서에 기록되어 있습니다. Ihaka & Gentleman (1996), “R: A Language for Data Analysis and Graphics”, Journal of Computational and Graphical Statistics, 5, 299–314.


2.8 R을 인용하는 방법

R을 참고자료로서 인용하고자 한다면, 아래의 BibTeX를 이용하시면 됩니다.

@Manual{,
  title        = {R: A Language and Environment for Statistical
                  Computing},
  author       = {{R Core Team}},
  organization = {R Foundation for Statistical Computing},
  address      = {Vienna, Austria},
  year         = 2015,
  url          = {https://www.R-project.org}
}

R과 R 패키지들에 대한 BibTeX 항목들또는 인용정보들은 citation()을 통하여 얻을 수 있습니다.


2.9 R과 관련하여 어떤 메일링 리스트들이 있나요?

이러한 서비스를 제공해 준 Martin Maechler에게 감사를 드립니다. 네가지 종류의 메일링 리스트가 있습니다.

R-announce

는 R의 개발과 새로운 코드의 유용성에 관한 주요 공지사항들을 위한 (moderated) 리스트입니다.

R-packages

는 새롭게 개발되거나 주요기능들이 강화된 패키지들의 유용성에 대한 공지사항들을 위한 (moderated) 리스트입니다.

R-help

은 R을 사용하면서 겪는 문제들과 이들에 대한 해법들을 논의하는 목적으로 사용되는 주된 메일링 리스트입니다. R의 개발과 새로운 코드들의 유용성에 관하여 ‘R-announce’와 ‘R-packages’에서 다루지 않은 공지사항들을 포함하기도 하며, R의 원시코드와 문서에 대한 강화된 기능 및 패치들에 대한 내용을 다루기도 합니다. S와 S-PLUS와의 호환성과 비교에 대한 내용도 있으며, 좋은 예제들과 벤치마크들을 포스팅할 목적으로도 사용합니다.

R-devel

는 R의 코드개발 (code development)에 관한 질문들과 논의를 위한 리스트입니다. R의 미래에 대한 논의, 새로운 기능에 대한 제안, 그리고 새로운 버전에 대한 테스트를 목적으로 이용될 수 있습니다. 이 리스트는 R의 개발에 적극적인 자세 (active position)을 유지하는 사람을 위한 것입니다.

Please read the posting guide before sending anything to any mailing list.

R-help 는 본래 R을 이용하여 본인의 문제를 해결하고자 하지만 프로그래밍에 대한 지식이 부족한 분들을 위해서 개설되었다는 것을 아셨으면 합니다. 따라서, 프로그래머가 아닌 사람들이 이해하기 어려운 질문들 (즉, C 혹은 C++ 과 연관된 내용)은 R-devel을 이용하시길 부탁드립니다.

Convenient access to information on these lists, subscription, and archives is provided by the web interface at https://stat.ethz.ch/mailman/listinfo/. One can also subscribe (or unsubscribe) via email, e.g. to R-help by sending ‘subscribe’ (or ‘unsubscribe’) in the body of the message (not in the subject!) to R-help-request@lists.R-project.org.

R-help 메일링 리스트를 구독하는 모든 이들에게 메시지를 보내기 위해서는 R-help@lists.R-project.org로 이메일을 보내주세요. 다른 메일링 리스트들의 구독 및 포스팅 요령은 r-help와 동일합니다. ‘R-help’ 대신에 ‘R-announce’, ‘R-packages’, ‘R-devel’ 이라고만 변경해주시면 됩니다. R-announce과 R-packages는 R-help에 이르는 과정이라는 점을 아시길 바랍니다. 만약 R-help를 구독하고 있지 않다면 둘 중 어느 하나는 구독을 해야합니다.

사용자가 R 코어 개발자들에게 개별적으로 이메일을 보내기 보다는 R-help에 메일을 보내주시길 부탁드립니다 (코어 멤버들 역시 메일링을 사용하고 있습니다). 이러한 부탁을 하는 이유는 코어 개발자들이 지속적으로 R을 향상시키는데 있어서 많은 시간을 줄여주기도 할 뿐더러, 질문자가 가장 빠른 시간내에 답변을 받을 수 있기 때문입니다.

버그리포트를 할 때에는 버그를 정확하게 재구현할 수 있도록 코드를 함께 올려주시면 매우 도움이 됩니다. 또한, 이러한 버그를 보고할 때 사용자가 어떤 시스템과 어떤 버전의 R 을 사용하는지 알려주시길 부탁드립니다. 더 자세한 사항들에 대해서는 R 버그(Bugs)를 살펴보세요.

See https://www.R-project.org/mail.html for more information on the R mailing lists.

코멘트와 리포트들을 R-core@lists.R-project.org을 통하여 R 코어팀에 보내주실 수 있습니다.

R project의 메일링 리스트들의 대부분은 또한 NNTP 뉴스리더를 이용하는 웹브라우저를 이용하여 읽을 수 있는 Gmane 또는 RSS 피드를 통해서 이용할 수 있습니다. 사용가능한 메일링 리스트들에 대해서는 http://dir.gmane.org/index.php?prefix=gmane.comp.lang.r.에서 확인하시길 바라며, RSS 피드에 대한 더 자세한 사항들은 http://www.gmane.org/rss.php에서 확인부탁드립니다.


2.10 CRAN이란 무엇인가요?

“Comprehensive R Archive Network” (CRAN)은 R 배포판, 기여된 확장 프로그램들 (즉, 패키지들), R과 관련된 문서들, 그리고 바이너리들로 구성되어 있는 동일한 자료들을 전달하는 사이트들의 모음을 의미합니다.

다음의 URL로부터 오스트리아(Austria) 빈(Wien) Wirtschaftsuniversit에서 CRAN 마스터 사이트를 찾을 수 있습니다.

https://CRAN.R-project.org/

데일리 미러(daily mirrors)들은 URL에서 찾을 수 있습니다.

http://cran.at.R-project.org/(Wirtschaftsuniversität Wien, Austria)
http://cran.au.R-project.org/(University of Melbourne, Australia)
http://cran.br.R-project.org/(Universidade Federal do Paraná, Brazil)
http://cran.ch.R-project.org/(ETH Zürich, Switzerland)
http://cran.dk.R-project.org/(dotsrc.org, Aalborg, Denmark)
http://cran.es.R-project.org/(Spanish National Research Network, Madrid, Spain)
http://cran.pt.R-project.org/(Universidade do Porto, Portugal)
http://cran.uk.R-project.org/(U of Bristol, United Kingdom)

See https://CRAN.R-project.org/mirrors.html for a complete list of mirrors. Please use the CRAN site closest to you to reduce network load.

CRAN으로부터 R의 가장 최신 공식 릴리즈, R의 데일리 스냅샷 (현재 소스트리의 복사본), gzip과 bzip으로 압축된 tar 파일들, 추가적으로 기여된 코드들, Linux, Mac OS Classic, Mac OS X, 그리고 MS Windows와 같은 다양한 운영체제를 위하여 미리 빌드된 바이너리들을 얻을 수 있습니다. CRAN은 또한 R 문서들, 메일링 리스트들, 그리고 버그트랙킹 시스템에 접근할 수 있도록 해줍니다.

CRAN 을 참조할때는 항상 마스터 사이트의 URL 을 사용해주시기 바랍니다.


2.11 R을 상업적 용도로 사용할 수 있나요?

R is released under the GNU General Public License (GPL), version 2. If you have any questions regarding the legality of using R in any particular situation you should bring it up with your legal counsel. We are in no position to offer legal advice.

R Core Team은 R 을 상업적 목적 (즉, 비지니스 혹은 컨설팅)으로도 사용할 수 있다고 생각합니다. 모든 오픈소스의 라이센스들과 같이 GPL은 패키지들의 모든 그리고 어떠한 (all and any) 용도로 사용되는 것을 허용합니다. 이것은 오로지 R 혹은 R 코드의 일부분을 포함하는 프로그램의 배포를 제한하는 것입니다. Open Source Definition의 제 6항 (clause 6) “No Discrimination Against Fields of Endeavor”에서 명확하게 나타납니다.

라이센스는 어느 특정 분야에서 이 프로그램이 사용되는것을 누구에게라도 제한해서는 않됩니다. 예를 들어, 이 프로그램이 유전자 연구나 어느 사업에서 사용되는 것을 제한 할 수없습니다.

The license must not restrict anyone from making use of the program in a specific field of endeavor. For example, it may not restrict the program from being used in a business, or from being used for genetic research.

이는 또한 GPL 제 0항 (clause 0)에서도 아래와 같이 (일부분만) 언급되어 있습니다.

복사, 배포 및 수정 이외의 활동은 본 라이센스에 포함되지 않습니다; 그런 활동들은 본 라이센스의 범위를 벗어난 활동들입니다. 프로그램을 실행시키는 행위는 제한되지 않습니다. 그리고, 프로그램의 출력물은 그 내용이 프로그램에 기초한 저작물을 구성하는 경우에만 포함됩니다.

모든 추천(recommended) 패키지들을 포함하여 대부분의 애드온(add-on) 패키지들은 이러한 방법으로서 상업적으로도 이용이 될 수 있음을 명시하고 있습니다. 몇개의 패키지들은 “non-commercial use”(비상업용적 용도)로서 제한됩니다. 이 경우 사용자는 반드시 저작권자에게 상업적 용도로의 활용여부를 문의하거나 법률상담가로부터의 조언을 찾아야 합니다.

이 섹션에 언급된 모든 논의는 법적조언이 아닙니다. R Core Team은 어떠한 경우에도 법적조언을 제공하지 않습니다.


2.12 왜 R이라고 이름을 짓게 되었나요?

R이라는 이름은 R을 최초로 개발한 두 개발자인 Robert Gentleman과 Ross Ihaka의 이름에서 기인하기도 하며, 동시에 Bell 연구소의 ’S’ 라는 언어에서 영감을 받기도 하였습니다 (see S란 무엇인가요? 섹션을 참고하세요).


2.13 R 재단(Foundation)은 무엇을 말하나요?

The R Foundation is a not for profit organization working in the public interest. It was founded by the members of the R Core Team in order to provide support for the R project and other innovations in statistical computing, provide a reference point for individuals, institutions or commercial enterprises that want to support or interact with the R development community, and to hold and administer the copyright of R software and documentation. See https://www.R-project.org/foundation/ for more information.


2.14 R-Forge는 무엇인가요?

R-Forge (https://R-Forge.R-project.org/) offers a central platform for the development of R packages, R-related software and further projects. It is based on GForge offering easy access to the best in SVN, daily built and checked packages, mailing lists, bug tracking, message boards/forums, site hosting, permanent file archival, full backups, and total web-based administration. For more information, see the R-Forge web page and Stefan Theußl and Achim Zeileis (2009), “Collaborative software development using R-Forge”, The R Journal, 1(1):9–14.


3 R과 S


3.1 S란 무엇인가요?

S는 데이터 분석과 그래픽스를 위한 하이레벨 언어 (high level language)이며 환경입니다. 1998년에 Association for Computing Machinery (ACM)는 1998년에 S언어의 주요설계자인 John M. Chambers에게 아래와 같이 치하하며 Software System Award를 수여하였습니다.

S 시스템은 영원히 사람들이 데이터를 분석, 시각화 그리고 조작하는 방법을 변화시켰다 …

the S system, which has forever altered the way people analyze, visualize, and manipulate data …

John Chambers 의 고마운 통찰력, 풍취와 노력으로 만들어진 S 는 훌륭하고, 널리 인정 받으며 개념적으로 완전한 지속적인 소프트웨어 시스템 입니다.

S 언어의 발전은 John Chambers와 공동저자들에 의하여 쓰여진 네권의 책들에 잘 설명되어 있습니다. 이들은 또한 S에 대한 주요 참고문헌이기도 합니다.

See https://statweb.stanford.edu/~jmc4/papers/96.7.ps for further information on the “Evolution of the S Language”.

CMU에 있는 S Repository에 가시면 사용자들이 제공한 매우 방대한 양의 S코드들을 있습니다.


3.2 S-PLUS란 무엇인가요?

S-PLUS is a value-added version of S currently sold by TIBCO Software Inc as ‘TIBCO Spotfire S+’. See https://en.wikipedia.org/wiki/S-PLUS for more information.


3.3 R과 S 사이에 다른 점이 있나요?

S는 현재 세가지 종류의 구현체 또는 “engines”(엔진)을 가진 언어로서 여길 수 있습니다. 이는 “old S engine” (S version 3; S-Plus 3.x 그리고 4.x), “new S engine” (S version 4; S-Plus 5.x 혹은 그 이후의 버전), 그리고 R입니다. 이러한 내용을 바탕으로 보면, “R과 S 사이의 다른점”에 대한 질문은 S언어를 이용하여 구현된 R의 세부사항들을 묻는것과 같습니다. 즉, R의 엔진과 S의 엔진 사이에 다른 점입니다.

이 섹션에서 이 지점 이후로, "S” 는 S 엔진이 아닌 S 언어를 의미합니다.


3.3.1 렉시컬 스코핑(lexical scoping)

S언어를 이용한 다른 구현체들과는 다르게 R은 내포된 함수 정의들(nested function definitions)이 렉시컬 스코프(lexically scoped)된 평가모델(evaluation model)을 사용합니다. 이것은 Scheme의 평가모델과 유사합니다.

이 차이점은 함수(function)내에서 free(자유)변수들이 발생할때 분명해집니다. 자유변수들은 함수의 인자목록에서 사용된 형식인자(formal argument)도 아니고, 함수의 본체에서 이들에 할당함으로서 생성된 지역변수(local variables)도 아닙니다. S에서는 자유변수들은 C와 유사하게 전역변수(global variable)들의 묶음에 의해서 결정되어 집니다. (C에서는 지역적 범위와 전역적 범위만이 있습니다). R에서 이들은 함수가 생성되어진 환경(environment)에 의해서 결정되어집니다.

다음의 함수를 보십시오:

cube <- function(n) {
  sq <- function() n * n
  n * sq()
}

S에서, sq()는 변수 n이 전역적으로 정의되지 않는 이상은 이에 대해서 알지 못합니다:

S> cube(2)
Error in sq():  Object "n" not found
Dumped
S> n <- 3
S> cube(2)
[1] 18

R에서는 cube()가 실행되었을때 생성된 “environment”(환경)이 살펴지게 됩니다:

R> cube(2)
[1] 8

실제로 다루어 볼 수 있는 흥미로운 문제로서, (연속)분포에서 샘플의 크기 n으로부터 r 번째의 order statistic (순서통계량)의 밀도함수를 구하는 함수를 작성해본다고 가정해 봅니다. 단순한 방법으로 우리는 분포의 cdf와 pdf 모두를 explicit arguments(명시적 인자들)로 사용해야 합니다. (이는 Luke Tierney에 의하여 작성된 다양한 포스팅으로부터 뽑아낸 예제입니다).

call()에 대한 S-PLUS 문서는 기본적으로 다음과 같이 하도록 안내합니다.

dorder <- function(n, r, pfun, dfun) {
  f <- function(x) NULL
  con <- round(exp(lgamma(n + 1) - lgamma(r) - lgamma(n - r + 1)))
  PF <- call(substitute(pfun), as.name("x"))
  DF <- call(substitute(dfun), as.name("x"))
  f[[length(f)]] <-
    call("*", con,
         call("*", call("^", PF, r - 1),
              call("*", call("^", call("-", 1, PF), n - r),
                   DF)))
  f
}

Rather tricky, isn’t it? The code uses the fact that in S, 이 코드는 S에서는 함수들이 마지막 인자와 같이 함수의 본체의 특정한 방식(mode)의 목록들이라는 사실을 이용하고 있습니다. 이러한 방식은 R에서 작동하지 않습니다 (누군가는 여기에서 사용된 아이디어를 성공적으로 구현할 수도 있을것입니다).

substitute()의 사용빈도가 매우 높으며 S와 R 모두 작동하는 것처럼 보이는 버전은 다음과 같습니다.

dorder <- function(n, r, pfun, dfun) {
  con <- round(exp(lgamma(n + 1) - lgamma(r) - lgamma(n - r + 1)))
  eval(substitute(function(x) K * PF(x)^a * (1 - PF(x))^b * DF(x),
                  list(PF = substitute(pfun), DF = substitute(dfun),
                       a = r - 1, b = n - r, K = con)))
}

(S에서는 eval()이 필요하지 않습니다).

그러나, R에서는 다음과 같은 더욱 쉬운 해결책이 있습니다:

dorder <- function(n, r, pfun, dfun) {
  con <- round(exp(lgamma(n + 1) - lgamma(r) - lgamma(n - r + 1)))
  function(x) {
    con * pfun(x)^(r - 1) * (1 - pfun(x))^(n - r) * dfun(x)
  }
}

이것은 “natural(자연스러운)” 구현 같이 보이며, 귀환된 함수(returned function)내에 있는 자유변수(free variable)들이 환경을 규정한 내부에서 찾아질 수 있기 때문에 잘 실행됩니다 (이것을 렉시컬 스코프(lexical scope)라고 합니다).

꼭 알아야 할 것은 함수 closure라는 것입니다. 즉, 함수를 평가하기 위하여 필요한 모든 variable binding(변수 바인딩)들 있는 본체를 의미합니다. 위의 버전의 경우, 값을 지닌 함수내의 자유변수들은 변경되지 않았기 때문에 S에서 이를 사용할 수 있을 뿐아니라, 만약 클로저 작동 (closure operation)을 함수 MC()로 이끌어 내고자 한다면 (클로져를 만들기 위해서) 다음과 같이 할 수 있습니다.

dorder <- function(n, r, pfun, dfun) {
  con <- round(exp(lgamma(n + 1) - lgamma(r) - lgamma(n - r + 1)))
  MC(function(x) {
       con * pfun(x)^(r - 1) * (1 - pfun(x))^(n - r) * dfun(x)
     },
     list(con = con, pfun = pfun, dfun = dfun, r = r, n = n))
}

적절한 클로져 연산자(closure operator)의 정의가 주어진다면 이것은 R과 S에서 모두 작동하며 substitute/eval을 활용한 것 (혹은 기본 스코핑 규칙(default scoping rule)을 평가 프레임(evaluation frame)에 대한 명시적 접근(explicit access)을 이용하여 무효화 하는 해결책, 물론 R과 S 모두 가능한) 보다 말끔한 해결책이라고 할 수 있습니다.

R에서는 MC()는 단순히 아래와 같습니다.

MC <- function(f, env) f

(lexical scope!), a version for S is

MC <- function(f, env = NULL) {
  env <- as.list(env)
  if (mode(f) != "function")
    stop(paste("not a function:", f))
  if (length(env) > 0 && any(names(env) == ""))
    stop(paste("not all arguments are named:", env))
  fargs <- if(length(f) > 1) f[1:(length(f) - 1)] else NULL
  fargs <- c(fargs, env)
  if (any(duplicated(names(fargs))))
    stop(paste("duplicated arguments:", paste(names(fargs)),
         collapse = ", "))
  fbody <- f[length(f)]
  cf <- c(fargs, fbody)
  mode(cf) <- "function"
  return(cf)
}

유사하게 대부분의 최적화 (optimization 또는 zero-finding) 루틴(rountine)들은 최적화 되어야 할 일부 인자들이 필요하며, 데이터에 의존하지만 최적화와 관련해서는 영향을 미치지 않는 다른 인자들을 가집니다. 이것은 R 스코핑 규칙(scoping rules)을 이용하면 단순하게 같은 환경내에서 필요한 정의들만을 가지고 함수를 만들게 되면 나머지는 스코핑이 알아서 처리하게 되므로 매우 간단한 문제입니다. S를 이용한 한가지 방법은 별도의 인자(extra parameter)를 함수와 이러한 별도의 인자들이 넘겨지게 될 옵티마이저(optimizer)에 추가하는 것이지만, 이는 오로지 옵티마이저가 지원될 경우에만 가능합니다.

중첩된 구조의 렉시컬 스코프를 따르는 함수들(nested lexically scoped functions)은 함수 클로져 (function closure)의 사용과 지역적 상태(local state)를 유지하는 것을 허용합니다. (Abelson과 Sussman으로부터 가져온) 간단한 예는 R 프롬프트에서 demo("scoping")이라고 입력함으로서 확인해 볼 수 있습니다. 이에 대한 더 많은 정보는 표준 R 참고자료인 “R: A Language for Data Analysis and Graphics” (see What documentation exists for R?)과 Robert Gentleman and Ross Ihaka (2000), “Lexical Scope and Statistical Computing”, Journal of Computational and Graphical Statistics, 9, 491–508. 으로부터 찾아 볼 수 있습니다.

중첩된 구조의 렉시컬 스코프를 따르는 함수들 (nested lexically scoped functions)은 더 중요한 다른 점을 의미합니다. S는 모든 객체들을 디렉토리의 어딘가에 (보통은 현재 디렉토리내에 .Data의 형식으로) 각각 다른 파일들로 저장하는 반면, R은 그러하지 않습니다. R의 모든 객체들은 내부적으로 저장됩니다. R이 실행되었을때, R은 메모리(memory)의 한 조각을 붙잡고 이를 객체를 저장하는데 사용합니다. R은 이러한 메모리 사용을 위한 메모리 관리기능(memory management)을 수행하고, 필요한 만큼의 크기를 늘이고 줄이게 됩니다. 심볼과 값들간의 바인딩(symbol/value pairs)에 관련된 모든 “환경(environments)”를 외부에서 유지하는 것은 거의 가능하지 않기 때문에 모든 것을 메모리내에서 관리할 필요가 있습니다. 이러한 차이 또한 R이 S보다 빠른 것 처럼 보이게 합니다.

다소 불편한 점이 있다면 R이 크래쉬(crash)되면 현재 세션에서 작업하는 모든 것을 잃게 됩니다. 메모리를 저장하고 복원하는 “images”(이미지라는 것은 R의 내부 메모리에 항시 저장되는 함수들과 데이터를 의미합니다)의 크기가 크다면 다소 느릴 수 있습니다. S에서는 이와 같은 일이 발생하지 않습니다. 그 이유는 모든것이 디스크 파일의 형식으로 저장되기 때문입니다 (누군가는 S 개발자들이 렉시컬 스코프을 위한 공간을 제공하는 것이 지속적인 저장방식을 사용하는 것보다 더 많은 비용이 들것이라고 느꼈을 것이라고 추측할 수도 있습니다). 그래서, 중요한 작업을 할때에는 가능한 크래쉬(crash)들로부터 보호하기 위해서 자주 저장하는 것을 생각해 볼 수 있습니다 (작업공간을 어떻게 저장할 수 있나요?를 살펴보세요). 또 다른 방법으로는 세션(session)을 기록(logging)하거나, source()를 이용하여 읽어들일 수 있는 텍스트 파일에 저장된 R 명령어들을 가지는 것입니다.

Note: 만약 R을 Emacs내에서 실행한다면 (R과 이맥스(Emacs)을 살펴보세요), 인터랙션버퍼(interaction buffer)안의 내용들(contents)를 파일에 저장하고 이들을 ess-transcript-mode를 이용하여 쉽게 조작할 수 있으며, 사용된 모든 함수와 데이터들의 원시복제(source copy)를 저장할 수 있습니다.


3.3.2 개발에 영향을 준 모델들(models)

모델링 코드(modeling code)에는 아래와 같이 몇가지 다른 점들을 볼 수 있습니다.


3.3.3 그 밖에

렉시컬 스코핑(lexical scoping)과 이것의 의미를 떠나서, R은 Blue와 White 책에 있는 S 랭귀지 정의(language definition)을 가능하면 많이 본땄기 때문에 결과적으로는 S를 이용한 “implementation”(구현물)입니다. S의 작동방식(behaviour)가 “not clean”(깔끔하지 못하다고) 고려되는 부분들에 있어서는 의도적인 다른 점들을 가지고 있습니다. 일반적 방침은 R은 S와 가능하면 호환될 수 있게 함과 동시에 사용자가 프로그래밍 에러를 찾을수 있게 도와주도록 하는 것입니다.

몇 가지 알려진 다른 점들을 아래에 설명하였습니다.

의도하지 않았지만, R에서 잘못된 코드 또는 누락된 부분으로 인한 다른 점 또한 있을 수 있습니다. 개발자들은 사용자가 찾게 되는 어떠한 결점들에 대하여 (사용자가 찾은 다른 점들에 대해서 충분하게 문서화된 보고서의 형태로서) 듣는것을 매우 감사히 여깁니다. 물론, 스스로가 변경을 해 본뒤에 이 변경이 확실하게 작동하는가를 확인해준다면 더욱 유용합니다.


3.4 R은 할 수 있지만 S-PLUS는 할 수 없는 것이 있나요?

R에서 할 수 있는 거의 모든 것들은 약간의 노력만으로 S-PLUS로 포트할 수 있는 소스 코드들이 있기때문에 S-PLUS에서 하지 못하는 것을 R에서 할 수 있지는 않을 것입니다 (그러나, 렉시컬 스코핑을 이용하는 것은 상당히 문제를 단순화 시킬 수도 있습니다).

R은 S-PLUS에서는 없는 몇가지 그래픽 기능들을 제공합니다. 라인(line)의 종류를 다루는데 더 나은 처리, (팔레트를 통한) 더 편리한 색상 관리, 색의 감마 보정, 그리고 가장 중요한 것은 TeX와 같은 입력을 이용하여 플랏 텍스트에 수학적 주석을 나타내는 것등입니다. 이러한 기능들을 볼 수 있는 좋은 예제들을 plotmath 도움말을 살펴보시길 바랍니다. 더 자세한 내용들은 Paul Murrell and Ross Ihaka (2000), “An Approach to Providing Mathematical Annotation in Plots”, Journal of Computational and Graphical Statistics, 9, 582–599 에서 찾아 볼 수 있습니다.


3.5 R-plus란 무엇인가요?

매우 오랜 기간동안 다음과 같은 것들은 존재하지 않았습니다.

XLSolutions Corporation은 R 플러스라고 읽는 R+라는 상업용 버전을 현재 베타 테스팅 하고 있습니다.

Revolution Analytics has released REvolution R, an enterprise-class statistical analysis system based on R, suitable for deployment in professional, commercial and regulated environments.

커머셜 버전의 R에 대해서는 http://en.wikipedia.org/wiki/R_programming_language#Commercialized_versions_of_R 를 참고하십시오.


4 R 웹인터페이스(Web Interfaces)

RwebJeff Banfield에 의해 개발되고 유지되고 있습니다. Rweb Home Page는 다음과 같은 세가지 버전의 Rweb을 제공합니다 — 결과물과 그래프를 반환해주는 간단한 텍스트 입력 방식, 여러 개의 창을 제공하며 좀 더 보기에 좋은 JavaScript 버전, 그리고 R 언어에 대한 지식이 요구되지 않고 기초 통계 과목들에 유요한 포인트와 클릭만으로 이루어진 버전들입니다. 만약 URL이 제공되어 있다면, 모든 Rweb 버전들은 웹에서 접근이 가능한 데이터들을 분석할 수 있습니다.

다른 버전들의 Rweb에 대한 자세한 설명과 Rweb이 어떻게 작동하는지에 대한 개요는 Journal of Statistical Software (http://www.jstatsoft.org/v04/i01/)에서 출간된 “Rweb: Web-based Statistical Analysis”에 설명되어 있습니다.

Ulf Bartel 은 R의 간단한 온라인식의 프로그램 환경인 R-Online 을 개발하였습니다. 이 는 R에서 사용되는 통계학 프로그래밍의 첫단계(특히 시계열)를 가능한한 쉽게 만들수있는 의도로 개발한것입니다. 사용자에 대한 요구사항은 자바스크립트가 가능한 브라우저 밖에 없으므로 로컬 설치를 할 필요가 없습니다. 자세한 내용은 http://www.osvisions.com/r_online/ 를 참조 하십시요.

Rcgi is a CGI WWW interface to R by MJ Ray. It had the ability to use “embedded code”: you could mix user input and code, allowing the HTML author to do anything from load in data sets to enter most of the commands for users without writing CGI scripts. Graphical output was possible in PostScript or GIF formats and the executed code was presented to the user for revision. However, it is not clear if the project is still active.

기본적으로 원격 서버에 R 코드를 제출 할수있게 해주는 R의 웹 인터페이스에 관한 부가적인 예들은 많이 있습니다. http://biostat.mc.vanderbilt.edu/twiki/bin/view/Main/StatCompCourse 에서 찾을수있는 링크 모음을 예로 참조 하십시요.

David FirthCRAN으로부터 얻을 수 있는 R 애드온 패키지인 CGIwithR을 작성하였습니다. 이것은 웹서버에 대한 CGI 인터페이스를 통하여 R script들을 실행할 수 있도록 하는 다소 간단한 R 익스텐션(extension)을 제공하며, GET과 POST 메소드들을 이용한 데이터의 서브미션 또한 가능합니다. 기본적으로 Linux의 Apache를 사용하여 쉽게 설치되고 R을 지원하는 모든 플랫폼과 인스톨러가 필요한 보안 권한(necessary security permissions)들을 모두 가지고 있는 있는 웹서버에서 작동을 해야 합니다. 이는 the Journal of Statistical Software (http://www.jstatsoft.org/v08/i10/)에 출판된 David의 논문 “CGIwithR: Facilities for Processing Web Forms Using R”에 있습니다. 현재 이 패키지는 Duncan Temple Lang에 의하여 관리되고 있으며, 웹페이지는 http://www.omegahat.org/CGIwithR/입니다.

Jeff Horner은 Apache 2(그리고 이후버전)내의 R 인터프리터(interpreter)를 보관하는 R/Apache 융합 프로젝트(Integration project)를 진행하고 있습니다. 튜토리얼과 프레젠테이션은 프로젝트 웹페이지 http://biostat.mc.vanderbilt.edu/twiki/bin/view/Main/RApacheProject에서 이용가능합니다.

Rserve is a project actively developed by Simon Urbanek. It implements a TCP/IP server which allows other programs to use facilities of R. Clients are available from the web site for Java and C++ (and could be written for other languages that support TCP/IP sockets).

R 웹인터페이스를 제공하는데 PHP를 사용한 두 개의 프로젝트가 있습니다. Steve Chen에 의해서 개발되는 R_PHP_Online(이 프로젝트가 아직 진행중인지는 불분명합니다)는 위의 Rcgi와 Rweb과 다소 비슷합니다. R-php는 Alfredo Pontillo와 Angelo Mineo에 의해 활발히 개발중이며, R 코드 입력이 필요하지 않은 미리 정의된 특수한 분석도구들이 제공됩니다.

webbioc is “an integrated web interface for doing microarray analysis using several of the Bioconductor packages” and is designed to be installed at local sites as a shared computing resource.

Rwui는 R 스크립트를 사용할 수 있도록 사용자 기반의 웹인터페이스를 생성해주는 웹 어플리케이션입니다. 웹 인터페이스에 대한 모든 코드가 자동으로 생성됩니다. 사용자가 추가적인 스크립트 작업을 하거나 새로운 스크립팅 기술들을 배울 필요가 없습니다.

The R.rsp package by Henrik Bengtsson introduces “R Server Pages”. Analogous to Java Server Pages, an R server page is typically HTML with embedded R code that gets evaluated when the page is requested. The package includes an internal cross-platform HTTP server implemented in Tcl, so provides a good framework for including web-based user interfaces in packages. The approach is similar to the use of the brew package with Rapache with the advantage of cross-platform support and easy installation.

Jeffrey Horner의 Rook 패키지는 Ruby의 Rack project의 많은 부분을 가져와 사용하는 웹서버 인터페이스를 제공합니다.

Finally, Concerto is a user friendly open-source Web Interface to R developed at the Psychometrics Centre of Cambridge University. It was designed as an online platform to design and run Computerized Adaptive Tests, but can be also used as a general-purpose R Web Interface. It allows R users with no programming or web designing background to quickly develop flexible and powerful online applications, websites, and psychometrics tests. To maximize its reliability, security, and performance, Concerto relies on the popular and reliable open-source elements such as MySQL server (exchange and storage of the data), Rstudio (R code designing and testing, file management), CKEditor (HTML Layer design), and PHP.


5 R Add-On Packages


5.1 어떤 애드온 패키지들이 존재하나요?


5.1.1 R에서 사용할 수 있는 애드온 패키지

R은 다음과 같은 패키지들과 함께 배포됩니다.

base

Base R 함수들 (그리고 R 2.0.0 전의 데이터셋들).

compiler

(R 2.13.0에서 더해진) R 바이트 코드 컴파일러(byte code compiler).

datasets

(R 2.0.0에서 더해진) Base R 데이터셋들.

grDevices

(R 2.0.0에 더해진) base와 grid 그래픽스를 위한 그래픽 장치들.

graphics

base 그래픽스를 위한 R 함수들.

grid

그래픽스 레이아웃 성능을 재작성하고 인터랙션을 위한 일부 지원이 추가됨.

methods

그린북에 설명되어 있는 것과 같이 R 객체들에 대하여 형식적으로 정의된 메소드들과 클래스들, 그리고 다른 프로그래밍 툴들.

parallel

포킹(forking), 소켓(sockets), 그리고 (R 2.14.0에 더해진) 난수생성(random-number generation) 기능을 포함한 병렬 연산(parallel computation)을 지원.

splines

리그레션 스플라인(regression spline)함수들과 클래스들.

stats

R 통계관련 함수들.

stats4

S4 클래스들을 이용한 통계 함수들.

tcltk

Tcl/Tk GUI 구성요소들에 인터페이스와 랭귀지 바인딩 (interface and language bindings).

tools

패키지 개발과 관리를 위한 도구들.

utils

R 유틸리티 기능

“base packages”(베이스 패키지)은 R 1.9.0에서 크게 재구성되었습니다. 이전의 basebase, graphics, stats, utils의 네가지로 나뉘어졌습니다. ctest, eda, modreg, mva, nls, stepfun, tsstats로 병합되었으며, lqs는 추천패키지인 MASS로 다시 옮겨지고, 패키지 mlestats4로 이동되었습니다.


5.1.2 CRAN으로부터 얻을 수 있는 애드온 패키지

CRANsrc/contrib 디렉토리는 R의 모든 바이너리 배포에 포함되어질 recommended(추천) 패키지들을 포함하여 방대한 양의 애드온 패키지들을 포함하고 있습니다.

KernSmooth

1995년에 M. P. Wand와 M. C. Jones에 의해 쓰여진 책 “Kernel Smoothing”을 바탕으로 한 Kernel smoothing(커널스무딩 또는 커널평활법)을 위한 함수들(그리고 밀도추정)을 포함합니다.

MASS

Venables 와 Ripley의 핵심 패키지 “Modern Applied Statistics with S”으로부터의 함수와 데이터셋들을 포함합니다 (2.10.0 이전의 R 버전들을 위한 VR번들에 포함되어 있습니다).

Matrix

(R 2.9.0 또는 이후 버전에 권장되는) 행렬 패키지입니다.

boot

1997년에 Cambridge University Press로부터 출판된 A. C. Davison과 D. V. Hinkley에 의해 쓰여진 “Bootstrap Methods and Their Applications”이라는 책으로부터 부츠트랩핑(bootstrapping)에 이용된 함수들과 데이터셋들을 포함하고 있습니다.

class

(k-nearest neighbor와 LVQ 같은) 클래시피케이션에 사용되는 함수들을 포함하고 있습니다 (2.10.0 이전의 R 버전들에는 VR 번들내에 포함되어 있었습니다).

cluster

클러스터 분석(cluster analysis)를 위한 함수들이 포함되어 있습니다.

codetools

(R 2.5.0 또는 그 이후의 버전들에 추천되는) 코드 분석 도구들이 포함되어 있습니다.

foreign

Minitab, S, SAS, SPSS, Stata, Systat등과 같은 통계 소프트웨어에 의해 저장된 데이터르르 읽고 쓰는데 필요한 함수들이 포함되어 있습니다.

lattice

트렐리스(Trellis) 그래픽 함수들의 구현체인 라띠스(lattice) 그래픽스가 포함되어 있습니다.

mgcv

GCV 또는 UBRE을 이용한 multiple soomthing parameter selection을 포함한 GAM 그리고 다른 generalized ridge regression 문제들을 위한 루틴들이 포함되어 있습니다.

nlme

가우시안(Gaussian) 선형과 비선형의 혼합 모델들(linear and nonlinear mixed-effects models)을 적합하고 비교하는 함수들이 포함되어 있습니다.

nnet

Single hideen perceptrons (“feed-forward neural networks”)와 다항로그선형모델(multinomial log-linear models)을 위한 소프트웨어입니다 (2.10.0 이전의 R 버전들에서는 VR 번들내에 포함되어 있었습니다).

rpart

재귀적 파티셔닝(recursive partioning)과 회귀나무(regression trees)를 수행하는 함수들이 포함되어 있습니다.

spatial

W. Venables와 B. Ripley에 의하여 씌여진 “Modern Applied Statistics with S”으로부터 크리깅과 포인트 패턴분석 (kriging and point pattern analysis)를 위한 함수들이 포함되어 있습니다 (2.10.0 이전의 R 버전들에서는 VR 번들내에 포함되어 있었습니다).

survival

벌점가능성 함수(penalized likelihood)함수를 포함한 생존분석(survival analysis)에 필요한 함수들을 포함하고 있습니다.

See the CRAN contributed packages page for more information.

Many of these packages are categorized into CRAN Task Views, allowing to browse packages by topic and providing tools to automatically install all packages for special areas of interest.

Some CRAN packages that do not build out of the box on Windows, require additional software, or are shipping third party libraries for Windows cannot be made available on CRAN in form of a Windows binary packages. Nevertheless, some of these packages are available at the “CRAN extras” repository at https://www.stats.ox.ac.uk/pub/RWin/ kindly provided by Brian D. Ripley. Note that this repository is a default repository for recent versions of R for Windows.


5.1.3 Omegahat으로부터 얻을 수 있는 애드온 패키지

Omega Project for Statistical Computing은 웹기반의 소프트웨어에 특별한 주안점을 두고 있는 통계 어플리케이션, Java, Java 버츄얼 머신, 그리고 분산 컴퓨팅(distributed computing)을 위한 다양한 오픈소스 소프트웨어를 제공하고 있습니다. CRAN 스타일의 R 패키지 저장소는 http://www.omegahat.org/R/를 통하여 이용할 수 있습니다. Omega project로부터 가능한 대부분의 R 패키지들에 대한 정보는 http://www.omegahat.org/에서 찾을 수 있습니다.


5.1.4 Bioconductor로부터 얻을 수 있는 애드온 패키지

Bioconductor is an open source and open development software project for the analysis and comprehension of genomic data. Most Bioconductor components are distributed as R add-on packages. Initially most of the Bioconductor software packages focused primarily on DNA microarray data analysis. As the project has matured, the functional scope of the software packages broadened to include the analysis of all types of genomic data, such as SAGE, sequence, or SNP data. In addition, there are metadata (annotation, CDF and probe) and experiment data packages. See https://www.bioconductor.org/download/ for available packages and a complete taxonomy via BioC Views.


5.1.5 다른 애드온 패키지

Many more packages are available from places other than the three default repositories discussed above (CRAN, Bioconductor and Omegahat). In particular, R-Forge provides a CRAN style repository at https://R-Forge.R-project.org/.

더 많은 코드들이 R-help 메일링 리스트에 올라오고 있으며, 메일링 리스트 보관소로부터 이들을 확인할 수 있습니다.


5.2 애드온 패키지는 어떻게 설치하나요?

(Unix와 같은 환경에서만 사용할 수 있습니다) CRAN의 애드온 패키지들은 실제로 한개 이상의 패키지들은 포함하는 “bundles”(번들)과 같이 pkg_version.tar.gz의 이름을 가진 gzip으로 압축된 tar 파일로 제공되어집니다. path를 그러한 패키지 파일에 대한 경로라고 가정합니다. 만약 targzip을 사용가능하다면, 쉘프롬프트에서 아래와 같이 입력해 보세요.

$ R CMD INSTALL path/pkg_version.tar.gz

위 명령문은 라이브러리 검색경로 (library search path)내 첫번째 디렉토리에서 갈려져 나오는 라이브러리 트리(library tree)를 설치하게 해줍니다. (검색경로가 어떻게 결정되는지에 대한 자세한 사항은 .libPaths()에 대한 도움말 페이지를 살펴보시길 바랍니다).

또 다른 트리 (예: 개인의 비공개 트리) 를 설치하려면 아래와 같이 입력하세요.

$ R CMD INSTALL -l lib path/pkg_version.tar.gz

여기에서 lib는 설치를 하고자 하는 라이브러리 트리(library tree)에 대한 경로를 의미합니다.

만약 CRAN과 같은 저장소들에 접근할 수 있다면, 더욱 더 편리하게 사용자는 R 내에서 패키지들을 설치하고 이들을 자동으로 업데이트 할 수 있습니다. 이에 대한 더 많은 정보들을 available.packages()의 도움말 페이지로부터 찾을 수 있습니다.


5.3 애드온 패키지는 어떻게 사용하나요?

아래의 명령문은 사용자의 시스템에 이용이 가능한 추가적인 패키지들을 확인하기 위한 것 입니다.

library()

위의 명령문을 R 프롬프트에서 입력합니다.

다음과 같은 결과를 생성해 줄 것입니다.

Packages in `/home/me/lib/R':

mystuff       My own R functions, nicely packaged but not documented

Packages in `/usr/local/lib/R/library':

KernSmooth    Functions for kernel smoothing for Wand & Jones (1995)
MASS          Main Package of Venables and Ripley's MASS
Matrix        Sparse and Dense Matrix Classes and Methods
base          The R Base package
boot          Bootstrap R (S-Plus) Functions (Canty)
class         Functions for Classification
cluster       Functions for clustering (by Rousseeuw et al.)
codetools     Code Analysis Tools for R
datasets      The R Datasets Package
foreign       Read Data Stored by Minitab, S, SAS, SPSS, Stata, Systat,
              dBase, ...
grDevices     The R Graphics Devices and Support for Colours and Fonts
graphics      The R Graphics Package
grid          The Grid Graphics Package
lattice       Lattice Graphics
methods       Formal Methods and Classes
mgcv          GAMs with GCV/AIC/REML smoothness estimation and GAMMs
              by PQL
nlme          Linear and Nonlinear Mixed Effects Models
nnet          Feed-forward Neural Networks and Multinomial Log-Linear
              Models
rpart         Recursive Partitioning
spatial       Functions for Kriging and Point Pattern Analysis
splines       Regression Spline Functions and Classes
stats         The R Stats Package
stats4        Statistical functions using S4 Classes
survival      Survival analysis, including penalised likelihood
tcltk         Tcl/Tk Interface
tools         Tools for Package Development
utils         The R Utils Package

설치된 패키지 pkg를 다음과 같은 방법으로 로드할 수 있습니다.

library(pkg)

어떤 함수들이 해당 패키지들로부터 제공되는지 아래에 나열된 명령어들 중 하나를 입력해봄으로서 확인할 수 있습니다.

library(help = pkg)
help(package = pkg)

사용자는 다음과 같은 방법으로 패키지 pkg를 로드하거나 언로드 할 수 있습니다.

detach("package:pkg", unload = TRUE)

(여기에서 unload=TRUE는 네임스페이스가 있는 패키지들에만 필요합니다. ?unload를 살펴보세요).


5.4 애드온 패키지는 어떻게 제거할 수 있나요?

아래는 패키지를 제거할때 사용합니다.

$ R CMD REMOVE pkg_1pkg_n

만약, R_LIBS가 설정되어 null이 아니면, R_LIBS내에 주어진 첫번째 디렉토리부터 갈려나오는 라이브러리 트리로부터 pkg_1, …, pkg_n을 제거합니다. 그렇지 않다면 디폴트 라이브러리로부터 제거됩니다. (1.3.0 이전의 R 버전들은 기본적으로 디폴트 라이브러리로부터 제거되었습니다).

라이브러리 lib으로부터 제거하기 위해서는 아래와 같이 입력하세요.

$ R CMD REMOVE -l lib pkg_1pkg_n

5.5 R 패키지는 어떻게 작성하나요?

패키지는 DESCRIPTION을 포함하는 서브디렉토리와 R, data, demo, exec, inst, inst, man, po, src, 그리고 tests라는 서브디렉토리들로 구성되어 있습니다 (이들 중 몇가지는 빠질 수도 있습니다). 패키지 서브디렉토리느느 또한 INDEX, NAMESPACE, configure, cleanup, LICENSE, LICENCE, COPYING, 그리고 NEWS 파일들을 포함할 수도 있습니다.

더 자세한 사항은 Writing R Extensions 문서의 “Creating R packages” 섹션을 살펴보세요. 이 매뉴얼은 R 배포에 포함되어 있으며 see What documentation exists for R?, 패키지의 구조, 설정(configure)과 클린업(cleanup) 메카니즘, 그리고 패키지의 확인(checking)과 구축(building)에 대한 정보를 제공합니다.

디렉토리들을 지정하고, 데이터와 코드를 저장하며, R함수들과 데이터세들에 대한 도움말 파일들의 구조를 생성하는데 사용되는 함수 package.skeleton()가 R 버전 1.3.0에서 추가되었습니다.

See CRAN이란 무엇인가요?, CRAN에 패키지를 업로드하는 방법에 대해서.


5.6 어떻게 R에 기여할 수 있나요?

R은 활발히 개발중이므로, 버그가 생길 수 있는 위험이 항상 존재합니다. 또한 개발자들은 R을 실행할 수 있는 모든 가능한 기계들에 대하여 접근하지 못합니다. 따라서, 이들을 이요하면서 문제들에 대해서 알려주는 것은 대단히 큰 가치를 가지고 있습니다.

The R Developer Page acts as an intermediate repository for more or less finalized ideas and plans for the R statistical system. It contains (pointers to) TODO lists, RFCs, various other writeups, ideas lists, and SVN miscellanea.


6 R과 이맥스(Emacs)


6.1 이맥스에서 R을 사용할 수 있나요?

통계 프로그램들과 통계 프로세스들 간의 기본 인터페이스를 제공하는 ESS (“Emacs Speaks Statistics”) 라고 불리는 패키지가 있습니다. 이는 통계 프로그래밍과 데이터 분석간의 쌍방향 소통을 위한 지원을 제공하는 것이 목적입니다. 지원되는 언어는 R, S 3/4, 그리고 S-Plus 3.x/4.x/5.x/6.x/7.x 와 같은 S 계열의 언어들(dialects), XLispStat, ViSta와 같은 LispStat계열의 언어들, SAS, Stata, 그리고 BUGS가 있습니다.

ESS는 버그 수정과 S/S-PLUS 버전 3만을 지원하는 GNU Emacs 확장에 대하나 필요성에 의해서 발달하였습니다. 현재의 개발자들은 XEmacs, R, S4, 그리고 MS Windows에 대한 지원을 갈망했습니다. 게다가, R, Stata, 그리고 SAS를 위한 개발되어질 새로운 방식과 사용자 인터페이스에 대해서 표준 이맥스 사용법을 따르는 두개의 그룹모두를 도움으로서 인터페이스와 프레임워크를 하나로 통합하는 것이 사용자와 개발자 모두에게 도움이 된다고 느꼈습니다. 그 결과로 일반적인 도구를 이용하는 것보다 통계 프로그래밍과 데이터 분석에 대한 능률이 증가되게 되었습니다.

R에 대한 지원은 R 소스코드를 편집하는데 필요한 코드 (구문적 띄어쓰기, 소스코드의 하이라이팅, 코드의 부분적 평가, 코드의 로딩과 오류 체크, 그리고 소스코드 수정 관리)과 문서화 (구문적 띄어쓰기, 소스코드의 하이라이팅, 실행 중인 ESS 프로세스에 예제 보내기, 그리고 미리보기), Emacs 내에서 R 프로세스와의 소통 (명령어 라인 편집, 검색이 가능한 명령어 히스토리, R 개체와 파일명에 대한 명령어 완성기능, 객체와 검색목록들에 대한 빠른 엑세스, 트랜스크립트 레코딩, 그리고 도움말과의 인터페이스), 그리고 기록의 조작 (레코딩과 트랜스크립트 파일들의 저장, 저장된 트랜스크립트의 편집과 조작, 트랜스크립 파일로부터의 명령어에 대한 재평가)를 포함합니다.

가장 안정적인 버전의 ESSCRAN 또는 ESS web page를 통하여 얻을 수 있습니다. HTML 버전의 문서는 http://stat.ethz.ch/ESS/로부터 찾을 수 있습니다.

ESS는 자세한 설치 사항들고 함께 주어집니다.

ESS에 대한 도움이 필요하다면 ESS-help@stat.math.ethz.ch로 이메일을 보내시길 바랍니다.

ESS에 대한 버그 리포트 또는 제안사항들을 ESS-bugs@stat.math.ethz.ch로 보내주세요. 이를 위한 가장 쉬운 방법은 Emacs안에서 M-x ess-submit-bug-report을 입력하거나, [ESS] 또는 [iESS] 풀다운 메뉴를 이용하는 것입니다.


6.2 이맥스 내부로부터 R을 실행해야 하나요?

네, 물론입니다. Inferior R 모드는 readline/history 메카니즘, 객체이름 완성, 폰트락모드 (Font Lock mode)를 이용한 인터랙션 버퍼(interaction buffer)의 구문강조기능, 또한 R도움말로의 편리한 인터페이스를 제공합니다.

물론, 이는 Emacs를 이용하여 R 소스를 편집하기 위한 메카니즘과도 잘 합쳐집니다. Emacs 버퍼에 코드를 작성하고, 전체 또는 부분을 실행하기 위해 R로 보낼 수 있습니다. 이것은 데이터 분석과 프로그래밍에 도움이 됩니다. 프로그램과 데이터의 변경에 대한 기록을 잘 유지하고 또한 이전 버전의 코드들을 다시 복구하기 위하여 버전관리시스템(revision control system)과도 통합할 수 있습니다.

추가로, 이는 트랜스크립트 모드(transcript mode)의 사용을 통하여 오류 복구(error recovery)에 이용될 수도 있는 세션의 기록을 보관하도록 허용합니다.

Inferior R 프로세스를 위하여 명령어 라인 인자들을 지정하기 위해서는 C-u M-x R을 이용하여 R을 시작하세요.


6.3 이맥스 내부로부터 R 디버깅하기

“from within Emacs”(이맥스 안쪽에서) R을 디버그하기 위해서는, 몇 가지 가능성들이 있습니다. 권장되어지는 디버거 GDB가 있는 Emacs GUD (Grand Unified Debugger) 라이브러리를 사용하기 위해서는 M-x gdb를 입력하고 R binary에 인자로서 경로를 줍니다. gdb 프롬프트에서 R_HOME과 필요하다면 다른 환경변수들 (즉, set env R_HOME /path/to/R을 이용하여, 그러나 아래도 살펴보세요)를 설정하고, 요구되어지는 인자들과 함께 바이너리를 시작합니다 (즉, run --quiet).

만약 ESS를 가지고 있다면, -d gdb 인자와 함께 inferior R 프로세스를 실행하기 위해서 C-u M-x R RET - d SPC g d b RET를 할 수 있습니다.

세 번째 옵션은 ESS(M-x R)를 통해 inferior R 프로세스를 시작하고나서 디버그 할 프로그램 R 바이너리 (전체경로의 이름을 사용함으로서)를 주는 GUD (M-x gdb)를 시작합니다. 현재 실행되고있는 R 프로세스의 프로세스 번호를 찾기 위해서 프로그램 ps를 사용하고, 그 프로세스에 부착하기 위해서 gdb 내에서 attach 명령을 이용합니다. 이렇게 하는 하나의 장점은 사용자가 *R**gud-gdb*이라는 분리된 창을 가진다는 것입니다. *R* 창에서는 객체명완성 (object-name completion)과 같이 우리가 알고 사랑하는 모든 ESS 기능들이 있습니다.

Emacs 내에서 디버깅을 위하여 GUD 모드를 사용할 떄, 코드가 들어있는 디렉토리를 현재의 작업디렉토리로 사용하고 이로부터 R 바이너리에 심볼릭 링크(symbolic link)를 만드는 것이 가장 편리하다는 것을 아마도 알게 될 수도 있습니다. 그렇게 하면 다음의 예제에서 보이는 바와 같이 .gdbinit는 코드와 함께 디렉토리 안에 계속 있고, 소스에 대한 환경과 검색경로들을 설정하는데 사용될 수 있습니다.

set env R_HOME /opt/R
set env R_PAPERSIZE letter
set env R_PRINTCMD lpr
dir /opt/R/src/appl
dir /opt/R/src/main
dir /opt/R/src/nmath
dir /opt/R/src/unix

7 R 기타사항들(Miscellanea)


7.1 리스트의 구성요소를 어떻게 NULL로 설정하나요?

아래처럼 할수있습니다.

x[i] <- list(NULL)

이렇게 하는 것은 리스트 xi번째 구성요소를 NULL로 지정하게 해줍니다. 동일한 방식이 구성요소의 이름을 이용할 때도 적용됩니다. 그러나, x[i] 또는 x[[i]]NULL의 값을 대입하지는 마시길 바랍니다. 그 이유는 이러한 대입은 해당 구성요소 자체를 리스트로부터 삭제합니다.

행렬 x의 행의 이름들을 없애기 위해서는 rownames(x) <- NULL를 하세요. 이러한 방법은 열의 이름들을 없애는데에도 유사하게 적용됩니다.


7.2 작업공간을 어떻게 저장할 수 있나요?

save.image() 함수는 사용자의 .GlobalEnv에 있는 객체들을 .RData의 형식으로 R의 스타트업 디렉토리에 저장합니다. (이것은 q("yes")라고 하는 것과 동일합니다). save.image(file)을 이용하여 다른 이름으로 저장하는 할 수도 있습니다.


7.3 작업공간을 어떻게 정리할 수 있나요?

현재 활성화 되어있는 프로그래밍 환경 (주로 .GlobalEnv를 의미함)에 있는 모든 객체를 지우려고 한다면 다음과 같이 하면 됩니다.

rm(list = ls(all = TRUE))

(만약 all = TRUE을 사용하지 않는다면, ‘.’으로 시작하지 않는 객체들만이 삭제됩니다.)


7.4 eval()과 D()를 어떻게 사용해야 하나요?

만약 eval(print(x), envir = e) 또는 D(x^2, "x")를 실행하고자 한다면 예상치 않은 결과가 나타날 것입니다. 전자는 x를 찾을 수 없다고 하거나, 잘못된 x의 값을 출력할 것입니다. 후자는 만약 x가 존재한다면 0값을 돌려줄 수 있으며, 그렇지 않다면 에러를 보여줄 것입니다.

두가지 경우 모두 다 불러들어온 환경 내에서 첫번째 인자가 평가되기 때문입니다. 객체의 모드가 반드시 "expression" 또는 "call"이어야 하고 그 결과가 평가되거나 미분된 것입니다. 이를 해결하기 위해서는 아래와 같이 반드시 첫번째 인자를 큰 따옴표로 묶어줘야 한다는것입니다.

R> D(expression(x^2), "x")
2 * x

이렇게 하는 것이 처음에는 다소 이상해 보일 수 있으나, 이것은 논리적으로인 것 뿐입니다. 직관적으로 작동하는 방식은 구현하기 쉬울 수도 있지만, 인자로서 변수를 포함하는 표현식 또는 호출하는 함수의 결과는 문제를 야기합니다. 예를들면, 다음과 같은 경우들입니다.

D2 <- function(e, n) D(D(e, n), n)

또는

g <- function(y) eval(substitute(y), sys.frame(sys.parent(n = 2)))
g(a * b)

더 많은 예제들을 deriv()의 도움말 페이지를 통하여 확인할 수 있습니다.


7.5 왜 행렬의 차원정보가 손실되나요?

하나의 열이나 행으로 이루어진 행렬은 서브스크립팅 연산(subscripting operation)에 의해 생성됩니다. 예를들면 row <- mat[2,]과 같습니다. 이는 기본적으로 벡터로 변환됩니다. 이와 유사하게 2 x 3 x 1 x 4이라는 차원을 가고 있는 배열을 서브스크립팅에 의해서 생성되어진다고 하면, 불필요한 차원을 삭제되어 2 x 3 x 4이라는 차원을 가진 배열로 강제변환이 되게 됩니다. 많은 논의를 거쳐 이는 feature로 결정되었습니다.

이러한 경우를 방지하기 위해는 서브스크립팅을 할 때 drop=FALSE를 사용해보세요.

rowmatrix <- mat[2, , drop = FALSE]  # 행 행렬을 만듭니다
colmatrix <- mat[, 2, drop = FALSE]  # 열 행렬을 만듭니다
a <- b[1, 1, 1, drop = FALSE]        # 1 x 1 x 1 의 배열을 만듭니다

drop = FALSE 옵션은 프로그래밍을 할 때에 디펜시브하게(defensively) 사용되어야만 합니다. 예를들어,

somerows <- mat[index, ]

위와 같은 표현에서 index의 길이가 1 이라면 행렬이 아닌 벡터를 반환하므로 에러를 불러일으킬 것입니다. 아래와 같이 고쳐 쓸수있습니다.

somerows <- mat[index, , drop = FALSE]

7.6 자동로딩(autoloading)은 어떻게 작동하는 것인가요?

R은 .AutoloadEnv이라고 불리는 특별한 환경(environment)가 있습니다. namepkg가 객체의 이름과 이를 포함하는 패키지를 건네주는 문자열(string)인 곳에서 autoload(name, pkg)를 이용하여 이 환경내에 정보를 저장하게 됩니다. R이 name을 평가하려고 할때, 이에 해당하는 패키지 pkg를 로드하고 새로운 패키지의 환경내에서 name을 재 평가합니다.

이러한 메카니즘을 이용하여 R은 만약 패키지가 로드되었더라도 (아직) 메모리를 차지않는 것과 같이 작동하도록 합니다.

매우 좋은 예제들이 autoload() 도움말에 있으므로 살펴보시길 바랍니다.


7.7 옵션을 어떻게 설정해야 하나요?

함수 options()는 R이 연산을 수행하고 이의 결과를 보여주는데 방법들에 있어서 영향을 미치는 다양한 전역(global) 옵션들을 설정하고 확인하도록 해줍니다. .Options의 값은 이러한 옵션들의 현재 값을 가지고 있으나, 만약 당신이 미쳐버리고 싶지 않다면 (unless you want to drive yourself crazy) 가급적이면 이를 “read-only”(읽기 전용)으로 두고, 직접적으로 조절하지 마시길 바랍니다.

예를들어, 아래의 예를 살펴보세요.

test1 <- function(x = pi, dig = 3) {
  oo <- options(digits = dig); on.exit(options(oo));
  cat(.Options$digits, x, "\n")
}
test2 <- function(x = pi, dig = 3) {
  .Options$digits <- dig
  cat(.Options$digits, x, "\n")
}

위의 예제로부터 우리는 아래의 결과를 얻을 것입니다.

R> test1()
3 3.14 
R> test2()
3 3.141593

실제로 쓰여지는 것은 .Options가 가지고 있는 global(전역)값이며, options(OPT=VAL)을 이용하여 이를 정확하게 업데이트 합니다. .GlobalEnv 또는 함수환경 (function frame, 즉 frame)내에 있는 .Options내의 로컬카피(local copies)들은 조용히 무시될 것입니다.


7.8 윈도우즈에서 파일명을 어떻게 사용해야 하나요?

R은 C-스타일의 문자열조작(string handling)을 이용하기 때문에, ‘\’를 이스케이프 문자(escape character)와 같이 처리하게 됩니다. 예를들면 ‘\n’은 개행문자(newline)을 입력하기 위해서 사용합니다. ‘\’이라는 문자가 정말로 필요할 때는 또 다른 ‘\’을 이용하여 함께 사용해야 합니다.

따라서, "c:\\data\\money.dat"와 같은 파일명을 작성하게 됩니다. 또한 ‘\’를 ‘/’로 변경하여 "c:/data/money.dat"와 같이 사용할 수도 있습니다.


7.9 플랏팅을 할 때 왜 색상배정에서 에러가 생기나요?

X11 장치를 이용할 때 demo("image")와 같이 플랏팅(plotting) 할때 “Error: color allocation error” (오류: 색상 할당 에러입니다)라는 메시지들 보게 될 때가 있습니다. 이것은 X의 문제이며 R과 간접적으로 관련이 있는 것입니다. 이것은 R을 실행하기 전에 어플리케이션들이 가능한 모든 색상들을 사용했을 때 발생하게 됩니다. (얼마나 많은 색상의 사용이 가능한지는 X의 설정에 따라 다릅니다; 때때로 오로지 256색상만이 사용될 수도 있습니다).

“eating” color (먹는 색, 즉 보여지지 않는 색)으로 악명이 높은 어플리케이션은 Netscape입니다. 만약 Netscape를 실행할때 이러한 문제가 발생한다면, 기본 컬러맵(default colormap)을 이용하는 -no-install 또는 특정컬러맵(private colormap)을 이용하는 -install 옵션을 이용하여 재시작을 시도해보세요.

X11()의 기본값인 "pseudo"를 사용하기 대신에 "pseudo.cube"로 설정할 수도 있습니다. 더 많은 내용에 대해서는 X11() 도움말 페이지를 참고해주세요.


7.10 어떻게 요인을 숫자로 변환할 수 있을까요?

R로 수치형 데이터를 읽어 들일때 (일반적으로 파일을 읽을때), 이들은 요인형(factor)로 인식되어 읽어지는 경우가 있습니다. 만약 f가 이러한 요인형 객체라면, 아래와 같이 한다면 수치형으로 다시 돌려주게 됩니다.

as.numeric(as.character(f))

좀 더 효율적이지만, 기억하기는 어려운 방법으로는 아래와 같이 합니다.

as.numeric(levels(f))[as.integer(f)]

어떠한 경우라도 주어진 작업에 대해서 as.numeric() 또는 그 비슷한 것들을 호출하지 마시길 바랍니다 (그 이유는 as.numeric() 또는 unclass()는 내부코드들을 보여줄 것이기 때문입니다).


7.11 R에서 트렐리스(Trellis)를 사용할 수 있나요?

추천 패키지인 lattice는 베이스 패키지인 grid에 기초를 두고 있습니다. 이 패키지는 대부분의 트렐리스(Trellis) 명령어와 호환되는 그래픽 기능을 제공하고 있습니다.

사용자가 원하는 것들 중 적어도 몇 가지는 가능한 coplot()dotchart()를 살펴보세요. R에서 제공하는 pairs()는 꽤 일반적이며, splom()의 대부분의 기능을 제공하고 있습니다. 또한, R의 기본적인 플랏 메소드는 플랏의 영상비(aspect ratio)를 지정 (및 장치의 크기에 따라 수정)할 수 있는 인자를 가지고 있습니다.

(단어 “Trellis”라는 단어가 상표(trademark)와 같이 사용되기 때문에, R에서는 이 단어를 사용하지 않습니다. R과 같은 것들에 대해서는 “lattice”라는 단어를 사용합니다).


7.12 인클로징과 부모환경이란 무엇인가요?

함수내에서 당신은 아마도 두 개의 추가적인 환경들에 있는 변수들에 접근하고 싶을 수도 있습니다. 하나는 (“enclosing(인클로징)”)이라는 환경내에 정의된 함수이고, 다른 하나는 (“parent(패런트)”)로부터 실행된 환경입니다.

만약 명령어 라인에서 함수를 생성하거나 패키지내에서 로드를 하였다면, 이것의 인클로징 환경은 글로벌 작업공간(global workspace)입니다. 만약 f()라는 함수를 g()라는 또 다른 함수내에서 정의를 했다면, 이것의 인클로징 환경은 g()내에 있는 환경입니다. 함수에 대한 인클로징 환경은 함수가 생설될때 고정됩니다. 함수 f()에 대한 인클로징 환경은 envrionment(f)를 이용하여 찾을 수 있습니다.

반면에 “parent(패런트)”환경은 함수를 실행할 때 정의되어 집니다. 만약 명령어 라인에서 lm()를 실행하면, 이것의 패런트 환경은 글로벌 작업공간(global workspace)가 됩니다. 만약 함수 f()에서 이것이 실행된다면 이의 패런트 환경은 f()내에 있는 환경이 됩니다. parent.frame() 또는 sys.frame(sys.parent())를 이용하여 함수의 실행에 대한 패런트 환경을 찾을 수 있습니다.

여지까지 사용자가 볼 수 있는 함수들의 인클로징 환경은 글로벌 작업공간일 것입니다. 그 이유는 대부분의 함수들의 정의된 위치가 글로벌 작업공간이기 때문입니다. 패런트 환경은 함수가 불러지는 곳이면 어디든지 될 수 있습니다. 만약 함수 f()가 다른 함수 g()안에 정의 되어 있다고 한다면, 이것은 g()함수 내에서 사용될 수 있기 때문에 패런트 환경과 인클로징 환경은 아마도 동일할 것입니다.

패런트 환경들은 모델 포뮬러(model formulas)와 같은 것들이 모든 변수들을 이용가능한 장소인, 즉, 함수가 호출된 환경에서 평가되는 것이 필요하므로 매우 중요합니다. 이것은 매번 실행에 따라 달라질 수도 있는 패런트 환경에 크게 영향을 받습니다.

인클로징 환경은 함수가 인크로징 환경내의 변수들을 다른 함수들 또는 자기 자신의 또다른 실행으로 가진 정보들을 공유하기 위하여 사용할 수 있기 때문에 중요합니다 (렉시컬 스코핑 섹션을 살펴보시길 바랍니다). 이는 함수가 매번 실행될때마다 동일한 인클로징 환경을 가져야 한다는 것을 필요로 합니다 (C에서는 이것을 정적변수(static variable)로 행하게 됩니다).

스코핑(scoping)은 어렵습니다. 예제들을 살펴보는 것이 도움이 됩니다. 왜 R과 S에서 다르게 실행이 되며, 이들이 왜 다른가를 살펴보는 것이 중요합니다. R과 S의 스코핑이 다른 점을 설명하는 하나의 방법은 S는 인클로징 환경이 항상 클로벌 작업공간인데 반해 R은 인클로징 환경이 함수가 생성되는 곳에서 발생하게 됩니다.


7.13 플롯의 라벨에 포함된 객체의 값을 어떻게 변경하나요?

종종 제목(title)과 같은 플랏 라벨(plot label)내에서 R 객체의 값을 사용하고자 할 때가 있습니다. 만약 라벨이 단순한 문자열이라면 paste()를 이용하여 쉽게 이루어지지만, 라벨이 정교한 수식을 가지는 표현일 경우에는 다소 어려움이 있습니다. 이 경우에는 연결된 문자열에 parse()를 이용하거나 수식에 대해서 substitute()를 이용합니다. 예를 들면, 만약 hat이 파라미터 a의 추정치라면, 다음과 같이 해 볼 수 있습니다.

title(substitute(hat(a) == ahat, list(ahat = ahat)))

(여기에서 ‘==’는 ‘=’이 아닙니다). 때때로 bquote()는 간결한 형식을 제공합니다.

title(bquote(hat(a) = .(ahat)))

여기에서 ‘.()’내에 닫혀진 부분은 값으로 대체됩니다.

더 많은 예제들이 메일링 리스트 저장소에 있습니다.


7.14 유효한 이름(valid names)이란 무엇인가요?

data.frame() 또는 read.table()을 이용하여 데이터 프레임을 생성하고자 할 때, R은 기본적으로 변수명이 구문상 (syntactically) 올바른지 확인하게 됩니다. (이러한 함수들에 인자 check.names는 변수명을 확인할 것인지에 대한 여부를 조정하고 만약 필요하다면 make.names()을 이용하여 조정하게 됩니다).

어떠한 이름들이 “유효한가”를 이해하기 위해서는 “name”(이름)이 어떤 방법으로 사용되는가를 알아야 할 필요가 있습니다.

  1. syntatic name(구문명)은 파서(parser)가 마치 표현식(expression)과 같은 유형으로 해석하게 되는 문자열을 의미합니다. 이것은 문자(letters), 숫자, 닷기호(dot), 언더스코어(underscore), 그리고 숫자바로 뒤에 오지 않는 문자 또는 닷기호로 시작하게 됩니다. 예약어(reserved words)는 구문명이 아닙니다.
  2. object name(객체명)은 표현식내에서 객체와 연관된 문자열을 의미합니다. 이 표현식은 할당연산자 (assignment operation)의 좌측에 있는 객체명을 가지거나 assign()함수에 이용되는 인자의 형태를 가지고 있습니다. 이것은 주로 구문명(syntatic name)이기도 하지만, 만약 따옴표로 묶인다면 공백을 가지지 않는 어떠한 문자열이라도 될 수 있습니다 (그리고 assign() 함수에 호출되는 된다면 이는 항상 따옴표로 묶이게 됩니다).
  3. argument name(인자명)은 f(trim=.5)와 같이 함수호출(function call)에 사용되는 인자로서 등부호(equal sign) 좌측에 나타나는 것입니다. 인자명은 또한 구문명(syntactic name)이기도 하지만, 위와 마찬가지로 따옴표로 묶여진다면 어떤 것이든 될 수 있습니다.
  4. element name(구성요소의 명칭 또는 요소명)은 리스트의 구성요소와 같이 객체의 조각을 구분하기 위한 문자열입니다. 이것이 ‘$’연산자의 우측에 사용될 때에는 반드시 구문명(syntactic name)이거나 따옴표로 묶여져야 합니다. 그렇지 않다면 요소명은 어떠한 문자열이든 될 수 있습니다. (객체가 eval() 또는 attach()에 호출될 때와 같이 데이터베이스로서 사용될 때, 요소명은 객체의 이름이 됩니다).
  5. 마지막으로, file name (파일명) 은 운영체제내에서 읽고 쓰기등을 할수있는 파일을 구분하는 문자열입니다. 사실 언어상 에서 뜻하는 이름과 별로 상관없지만, 전통적으로 이런 문자열을 "이름 (명)" 이라고 부릅니다.

7.15 R에서 GAM 모형을 사용할 수 있나요?

CRAN으로부터 얻을 수 있는 패키지 gam은 화이트 북(the White book)의 GAM 챕터에 설명된 모든 Generalized Additive Models (GAM)을 구현하였습니다. 특히, 이는 local regression과 smoothing spline를 사용하는 백피팅(backfitting)을 구현하였고, 확장할 수있습니다. 패키지 mgcv는 GAM을 위한 gam() 함수가 있는데, 이는 화이트북에 설명된 것과 완전히 동일하지는 않습니다 (예를들면 lo()라는 것은 없습니다). 패키지 gss는 스플라인 기반(spline-based)의 GAM을 이용할 수 있습니다. 만약 리그레션 스플라인(regression spline)을 수용한다면, glm()을 사용할 수도 있습니다. Gaussian GAM의 경우에는 mda라는 패키지에 있는 bruto()를 사용할 수 있습니다.


7.16 파일을 source() 할 때 왜 결과물이 출력되지 않나요?

대부분의 R 명령어들은 어떠한 결과물을 생성하지 않습니다.

1+1

위의 입력은 2 라는 값을 출력합니다.

summary(glm(y~x+z, family=binomial))

위의 명령어는 로지스틱 리그레션 모델(logistic regression model)을 적합한뒤, 요약된 정보를 산출한뒤 "summary.glm"이라는 클래스의 객체를 반환합니다 (see summary 메소드를 어떻게 작성해야 하나요?).

만약 명령어 라인에서 ‘1+1’ 또는 ‘summary(glm(y~x+z, family=binomial))’ 이라고 입력한다면, 반환된 값들이 invisible()이 아닌 이상은 자동으로 출력됩니다. 그러나, source()를 이용하여 파일을 읽어들이거나 함수내에서 사용되는 경우에는 특별히 프린트라는 명령을 지정하지 않는 이상은 보여지지 않습니다.

이러한 값을 출력하기 위해서는 다음과 같이 해야 합니다.

print(1+1)

또는

print(summary(glm(y~x+z, family=binomial)))

혹은 source(file, echo=TRUE)라고 해야합니다.


7.17 사용자 정의 함수내에서 outer()가 왜 이상하게 작동하나요?

outer()의 도움말에 명시된 것과 같이, 이는 apply()계열의 함수들이 작동하는 방식을 가지는 함수들과는 함께 쓰일 수 없습니다. 이를 사용하기 위해서는 배열의 구성요소단위별로 작동하는 벡터라이즈된 함수가 필요합니다. 코드 outer(x,y, FUN)를 보면 알 수 있듯이, 이는 xy의 모든 가능한 조합들을 포함하는 두 개의 큰 벡터들을 생성한 뒤, 이를 FUN에 전달하게 됩니다. 사용자의 함수는 아마도 이렇게 큰 두개의 벡터들을 파라미터로서 다룰 수 없을 것입니다.

만약 두 개의 벡터를 다룰 수는 없지만 두개의 스칼라(scalars)를 다룰 수 있는 함수를 가지고 있다면, outer()를 사용할 수는 있으나, 사용자의 함수에 이를 둘러쌓아야만 합니다. 아래와 같은 사용자 함수를 생각해 봅니다.

foo <- function(x, y, happy) {
  stopifnot(length(x) == 1, length(y) == 1) # scalars only!
  (x + y) * happy
}

만약, 사용자가 다음과 같이 일반적인 함수를 정의한다면,

wrapper <- function(x, y, my.fun, ...) {
  sapply(seq_along(x), FUN = function(i) my.fun(x[i], y[i], ...))
}

outer()를 아래와 같이 사용할 수 있습니다.

outer(1:4, 1:2, FUN = wrapper, my.fun = foo, happy = 10)

스칼라 함수들은 Vectorize() 를 사용하여 벡터화 할수있습니다.


7.18 anova()로부터 나온 결과는 왜 모델 내에 주어진 요인들의 순서에 따라 달라지나요?

~A+B+A:B와 같은 모델내에서, R은 ~1, ~A, ~A+B, ~A+B+A:B 모델들의 제곱합(sums of squares)를 모두 다르게 보여줄 것입니다. 만약, 모델이 ~B+A+A:B이었다면 ~1, ~B, ~A+B, ~A+B+A:B 역시 다르게 보여줄 것입니다. 첫번째의 경우에는 A에 대한 제곱합은 ~1~A에 비교되고, 두번째의 경우에는 ~B~B+A와 비교됩니다. 대부분의 언밸런스드 디자인(unbalanced design)인 비직교디자인(Non-orthogonal design)에서는 이러한 비교는 개념상으로나 수치연산상으로 다릅니다.

일부 패키지들은 풀모델(full model)에서 요인(factor)를 한번에 하나씩 지워나가는 모델들과 비교한 제곱합 (예를들면, SAS 에서 ‘Type III sums of suqares’)를 보고합니다. 이는 모델에서 사용된 요인의 순서에 영향을 받지 않습니다. 어떤 종류의 제곱합이 올바른것인지에 대한 질문은 때때로 R-help에서 많은 논쟁거리를 유발합니다 (provokes low-level holy wars).

R이 알려주는 특정한 제곱합에 대해서는 걱정할 필요는 없습니다. 사용자가 선호하는 제곱합을 손쉽게 계산할 수 있습니다. 두 모델은 anova(model1, model2)을 이용하여 비교되어지고, drop1(model1)은 한 개의 항을 빼낸뒤 얻어낸 제곱합을 보여줄 것입니다.


7.19 배치모드에서 PNG 그래픽을 어떻게 생성하나요?

Unix와 같은 환경에서 설치시 png() 장치에 대하여 type="cairo"를 지원된다면, 아무런 문제가 없어야 하며 기본설정대로 작동해야합니다. 이 옵션은 2.7.0 이전 버전에서는 사용할 수 없거나, cario에 대한 지원이 없습니다. R 2.7.0부터는 기본적으로 png()는 Mac OS X에서는 Quartz 장치를 이용하며 이는 배치모드에서도 실행됩니다.

png()의 이전 버젼은 배치모드나 원격 조작 (remote operation)할때 문제가 될수있는 X11 드라이버를 사용했습니다. Ghostscript 가 설치되어 있다면, PostScript 나 PDF 를 산출한뒤 Ghostscript에서 지원되는 bitmap 포맷으로 변환시켜주는, bitmap() 을 사용할수 있습니다. 일부 설치에서는 보기 흉한 출력이 나올수 있으나, 그 외에는 아주 만족스러울 것입니다. 요즘 많은 시스템들은 X.Org 에서 구할수있는, 화면이 필요없는 X11서버인, Xvfb 가 장착되어 (임의로 설치 해야 할수도 있음) 나오고 있습니다; 그리고, CRAN 에서 구할수있는, X11없이 PNG, JPEG 와 GIF bitmap들을 산출하는, GDD 패키지도 있습니다.


7.20 명령어 기반의 편집기능은 어떻게 사용하나요?

R과 함께 사용되는 Unix와 같은 커맨드라인은 오로지 빌트인 커맨드 라인 편집기(inbuilt command line editor)만을 제공합니다. 이 편집기는 만약 GNU readline 라이브러리가 컴파일에서 R에서 설정되었을때만 불러오기, 편집하기, 이전 명령어를 재실행할 수 있습니다. 이를 위해서는 적합한 헤더(headers)를 포함하고 있는 개발버전의 readline이 필요하므로, 리눅스 바이너리 배포를 사용하는 사용자들은 libreadline-dev (Debian) 또는 readline-devel (Red Hat)과 같은 패키지가 필요할 수 있습니다.


7.21 문자열을 어떻게 변수로 바꿀 수 있나요?

만약 아래와 같은 명령을 실행했다고 가정합니다.

varname <- c("a", "b", "d")

아래의 명령문은

get(varname[1]) + 2

아래와 같은 역할을 합니다.

a + 2

또는

assign(varname[1], 2 + 2)

아래와 같은 역할을 합니다.

a <- 2 + 2

또는

eval(substitute(lm(y ~ x + variable),
                list(variable = as.name(varname[1]))))

아래와 같은 역할을 합니다.

lm(y ~ x + a)

최소한 처음 두가지 경우에는 리스트(list)를 이용한 뒤, 아래와 같이 요소명을 이용하여 보다 쉽게 사용할 수 있습니다.

vars <- list(a = 1:10, b = rnorm(100), d = LETTERS)
vars[["a"]]

이렇게 난잡하지 않게 정리할수 있습니다.


7.22 왜 lattice/treliis 그래픽이 작동하지 않나요?

가장 큰 이유는 R에 그래프를 보여줄 것을 명령하는 것을 잊은 것입니다. xyplot()과 같은 라띠스 함수(lattice function)들은 그래프 객체를 생성하지만, 보여주지는 않습니다. (ggplot2 그래픽스와 S-PLUS의 Trellis 그래픽스 또한 마찬가지입니다). 그래프 객체를 실제적으로 보여주기 위해서는 print() 메소드를 이용해야 합니다. 커맨드 라인에서 이러한 함수들이 대화식으로 사용될때에는 자동적으로 보여지게 되지만, source()를 이용하거나 사용자가 작성한 함수내에서 이용될 때에는 명시적으로 print()를 사용해야 합니다.


7.23 데이터 프레임의 행들을 어떻게 정렬하나요?

데이터 프레임내에 있는 한 개 이상의 열들안에 있는 값들에 대해서 행들을 정렬하고자 한다면, order()를 이용하면 됩니다. (예를들어, DF[order(DF$a, DF[["b"]]), ] 라고 하는 것은 데이터 프레임 DFab라는 열들을 이용하여 정렬해줍니다).


7.24 왜 help.start() 검색엔진이 작동하지 않나요?

help.start()내의 브라우저 기반의 검색엔진은 Java applet을 이용합니다. 이것이 올바르게 작동하게하기 위해서는 Java와 호환가능한 버전이 설치되어야 하고, Java와 Javascript 모두 브라우저에서 사용가능하도록 설정되어 있어야 합니다.

Java와 브라우저의 버전들에 많은 호환성 문제들이 존재합니다. 더 자세한 사항은 R Installation and Administration 문서내의 “Enabling search in HTML help” 섹션을 살펴보세요. 이 매뉴얼은 R 배포판에 포함 see What documentation exists for R?되어 있으며, 이의 HTML 버전은 HTML 검색페이지와도 링크가 되어 있습니다.


7.25 R을 업데이트하고 나면 왜 .Rprofile이 더 이상 작동하지 않나요?

NEWS 파일을 읽어 보셨나요? base 패키지에 없는 함수들을 이용하기 위해서는 올바른 패키지 네임스페이지를 지정해야만 합니다. 그 이유는 코드들은 패키지들이 로드되기 전에 실행될 것이기 때문입니다. 예를들면, 다음을 살펴보세요.

ps.options(horizontal = FALSE)
help.start()

위의 코드들은 아래와 같이 될 필요가 있습니다.

grDevices::ps.options(horizontal = FALSE)
utils::help.start()

(graphics::ps.options(horizontal = FALSE) 는 R 1.9 이후 버젼에서 가능합니다).


7.26 모든 메소드들은 어디로 가게 되나요?

현재 많은 함수들 (특히 S3 메소드들)은 네임스페이스(namespaces)에서 보여지지 않습니다. 이렇게 하는 것은 부주의하게 잘못된 클래스들을 인자로 호출되지 않게 하는 장점이 있지만 확인하기가 더 힘들어 지게 됩니다.

S3 메소드 (즉, [.terms])에 해당하는 원시코드를 확인하고 싶다면 아래의 함수를 이용해 보세요.

getS3method("[", "terms")

패키지 "bar"의 네임스페이스 내에서 아직 내보지지 않은 함수 foo()의 원시코드를 확인하기 위해서는 foo()를 이용하세요. 사용자가 작성한 코드내에서 내보어지지 않은 함수들을 호출하려고 할때는 이렇게 사용하지 마시길 바랍니다. 그들은 아마도 어떠한 이유에서 내보어내어지지 않았거나 경고가 없이 변경될 수도 있기 때문입니다.


7.27 축의 라벨을 어떻게 회전시킬 수 있나요?

(base 그래픽스를 이용하여) 축 라벨들을 회전시키기 위해서는 mtext() 보다는 text()를 사용해야 합니다. 그 이유는 par("srt")를 지원하지 않기 때문입니다.

## 회전된 라벨에 공간을 주기위해 아랫쪽 마진을 넓혀줌
par(mar = c(7, 4, 4, 2) + 0.1)
## x 축과 x 축 레이블이 없는 도면 (plot)을 만듬
plot(1 : 8, xaxt = "n",  xlab = "")
## x 축에서 라벨없이 틱 마크 (tick marks)만 보이게 설정 함
axis(1, labels = FALSE)
## 텍스트 라벨을 만듬
labels <- paste("Label", 1:8, sep = " ")
## x 축을 따라 라벨을 기본의 틱 마크 (tick marks) 에 맞춰 출력 함
text(1:8, par("usr")[3] - 0.25, srt = 45, adj = 1,
     labels = labels, xpd = TRUE)
## x 축 레이블을 (7개 중) 6 번째 줄에 출력 함
mtext(1, text = "X Axis Label", line = 6)

x 축라벨들을 플랏할때, 문자회전의 각도로 srt=45를 사용했고, 틱마크의 위치에 문자의 오른쪽 끝을 위치시키기 위해서 adj=1을 이용했으며, 플랏영역 바깥쪽의 텍스트를 위하여 xpd=TRUE가 사용되었습니다. x축에 비례하여 위 또는 아래로 축라벨을 이동시키는데 필요한 0.25 오프셋의 값을 조정할 수도 있습니다. 더 많은 정보를 위해서는 ?par를 살펴보세요.

Figure 1를 보시고, 이와 관련된 코드를 Paul Murrell (2003), “Integrating grid Graphics Output with Base Graphics Output”, R News, 3/2, 7–12 에서 찾아보시길 바랍니다.


7.28 read.table()의 사용이 왜 비효율적인가요?

기본적으로 read.table()은 모든 것들을 문자형 데이터로서 읽어들인 뒤, 어떤 변수가 숫자 또는 요인으로 변경되어야 하는지에 대하여 결정을 하게 됩니다. 크기가 큰 데이터셋의 경우에는 이러한 방식은 꽤 많은 시간과 메모리를 필요로 합니다. 테이블의 열들을 어떤 클래스로 읽어들일 것인지를 지정하는데 이용되는 colClasses 인자를 사용하면 성능이 상당히 향상될 수 있습니다.


7.29 What is the difference between package and library?

package(패키지)는 표준화된 방식으로 코드, 데이터, 그리고 문서를 제공함으로서 R을 확장할 수 있는 자료들의 모음입니다. library(라이브러리)는 R이 사용할 수 있는 (설치된) 패키지들을 찾는 디렉토리를 의미압니다. R은 함수 library로의 호출을 통하여 패키지를 (“load(로드)”하고, 이를 검색경로에 추가하라고) 사용하라고 전달하게 됩니다. 즉, library()는 패키지들을 포함하고 있는 라이브러리들로부터 패키지를 로드하는데 쓰입니다.

더 자세한 사항은 See R Add-On Packages을 살펴보시길 바랍니다. Uwe Ligges (2003), ‘R Help Desk: Package Management”, R News, 3/3, 37–39 또한 살펴보시면 도움이 됩니다.


7.30 패키지를 설치하였지만 함수가 존재하지 않습니다

패키지를 실제적으로 이용하기 위해서는 library()를 이용하여 로드되어져야 합니다.

See R Add-On Packages and What is the difference between package and library? for more information.


7.31 왜 R은 이 숫자들이 서로 같다고 하지 않는 것인가요?

R의 숫자의 유형들 중에서 정확하게 표현될 수 있는 숫자들은 정수(intergers)과 분모가 2의 자승(power of 2)인 분수(fractions) 뿐입니다. 다른 숫자들은 (일반적으로) 이진법으로 53자리숫자에서 반올림 되어집니다. 그 결과 같은 알고리즘에 의하여 얻어진 결과가 아니라면 두 부동소수점(floating point numbers)들은 같지 않을 것입니다. 예를들면, 다음과 같습니다.

R> a <- sqrt(2)
R> a * a == 2
[1] FALSE
R> a * a - 2
[1] 4.440892e-16

함수 all.equal().Machine$double.eps ^ 0.5의 오차범위내에서 두개의 객체를 비교합니다. 만약, 이보다 더 높은 수준의 정확도를 원한다면 에러전파(error propagation)을 조심스럽게 생각해보아야 합니다.

더 많은 정보를 David Goldberg (1991), “What Every Computer Scientist Should Know About Floating-Point Arithmetic”, ACM Computing Surveys, 23/1, 5–48 에서 찾아 볼 수 있으며, 또한 http://www.validlab.com/goldberg/paper.pdf에서도 볼 수 있습니다.

Kernighan과 Plauger에 의해서 씌여진 “The Elements of Programming Style”에서 인용을 하자면, 다음과 같습니다.

10.0 곱하기 0.1은 1.0이 되기 어렵다.


7.32 시간이 오래 걸리는 시뮬레이션을 수행할 때 어떻게 해야 에러를 찾을 수 있거나 무시할 수 있나요?

에러 대신에 "try-error"라는 클래스의 객체를 반환하고자 한다면 try()를 이용하거나, 좀 더 유연하게 다른 값을 반환할 수 있는 tryCatch()를 이용해 보세요. 예를들어,

beta[i,] <- tryCatch(coef(lm(formula, data)),
                     error = function(e) rep(NaN, 4))

위의 예제는 성공적으로 수행된다면 lm()의 계수(coefficients)를 반환하고, 실패할 경우에는 c(NaN, NaN, NaN, NaN)을 돌려주게 됩니다 (이 경우에는 계수가 4개라고 가정했습니다).


7.33 음수의 거듭제곱이 왜 틀리나요?

아마 다음과 같은 경우에 이러한 질문이 생길 수 있니다.

R> -2^2
[1] -4

이는 R의 표현식에 대한 우선순위 규칙(precedence rules)를 잘 못 이해한 경우에 해당합니다. 올바른 결과를 얻기 위해서는 다음과 같이 해야

R> (-2)^2
[1] 4

-2의 제곱에 대한 올바른 값을 얻을 수 있습니다.

우선순위 규칙은 ?Syntax 내에 정리되어 있으며, 어떻게 R이 해석하는지를 알기 위해서는 구문트리(parse tree)를 보시길 바랍니다.

R> as.list(quote(-2^2))
[[1]]
`-`

[[2]]
2^2

7.34 어떻게 해야 반복문의 매 과정으로부터 생성되는 결과를 각각의 다른 파일에 저장할 수 있나요?

이를 수행하는 한가지 방법으로는 file.path()로 경로를 지정해주면서 파일명과 각 반복단계를 나타내는 숫자를 한데 결합시켜줄 수 있는 paste() (또는 sprintf())를 이용하는 것입니다. 예를들면, 결과물을 현재의 작업디렉토리인 Resultsresult1.rda, …, result100.rda이라는 파일에 저장하기 위해서는 다음과 같이 할 수 있습니다.

for(i in 1:100) {
  ## Calculations constructing "some_object" ...
  fp <- file.path("Results", paste("result", i, ".rda", sep = ""))
  save(list = "some_object", file = fp)
}

7.35 lmer()을 사용할 때 왜 p-값을 찾을 수 없나요?

r-help 리스트에 포스트된 이 질문에 대해서 Doug Bates는 매우 친절하게 폭넓은 응답을 해주었으며, 이는 https://stat.ethz.ch/pipermail/r-help/2006-May/094765.html에서 확인할 수 있습니다.


7.36 PS 또는 PDF 파일로 저장된 플롯을 볼 때 왜 원치 않는 테두리, 선 또는 그리드와 같은 인공물들이 있나요?

이것은 polygon(), filled.contour(), image(), 또는 이런 함수들을 내부적으로 호출하게 되는 함수들을 이용할 때 발생합니다. polygon()의 경우에는 border인자를 NA 또는 "transparent"로 지정해주었음에도 다각형(polygon)들 사이에 원하지 않는 경계(border)가 생기는 것을 볼 수 있을 수도 있습니다.

이 문제의 원인은 플랏이 anti-aliased되어 있을때 PS/PDF 뷰어에 있습니다. 이 문제들의 근원은 plot이 안티얼라이스드(anti-aliased, 그래픽에서 계단식 모양의 가장자리를 제거하는 처리 과정)되었을 때의 PS/PDF 뷰어입니다. 문제해결에 대한 자세한 사항은 사용하는 뷰어 및 운영체제에 따라 다르며, 시간이 지남에 따라서 달라질 수도 있습니다. 일부 일반적인 뷰어들에서는 다음과 같이 해 볼 수 있습니다.

Acrobat Reader (cross platform)

개인설정(Preference)메뉴에 텍스트 스무딩(Text smoothing), 이미지 스무딩(image smoothing)과 라인아트 스무딩(line art smoothing)을 활성/비활성하는 옵션이 있습니다. 여기에서 라인아트 스무딩을 사용하지 않도록 조정하세요.

Preview (OS X)

개인설정(Preference)에서 텍스트(text)와 라인아트(line art)에 대한 안티얼라이싱(anti-aliasing)을 활성/비활성하는 옵션션이 있습니다. 이 옵션을 비활성화 하세요.

GSview (cross platform)

텍스트 알파(Text Alpha)와 그래픽 알파(Graphics Alpha)를 설정하도록 합니다. 그래픽 안티얼라이싱 (graphic anti-aliasing)을 비활성화 하기 위해서 그래픽 알파를 4비트에서 1비트로 변경하세요.

gv (Unix-like X)

안티얼라이싱(anti-aliasing)을 활성/비활성화하는 옵션이 있습니다. 이 옵션을 비활성화하세요.

Evince (Linux/GNOME)

이 뷰어에서는 안티얼라이싱을 비활성 시키는 옵션이 하나도 없습니다.

Okular (Linux/KDE)

GUI에서 안티얼라이싱의 활성/비활성을 조절하는 옵션이 없습니다. 콘솔상에서 명령어라인으로 아래와 같이 해보세요.

$ kwriteconfig --file okularpartrc --group 'Dlg Performance' \
               --key GraphicsAntialias Disabled

Okular를 재실행 보세요. 본래의 설정으로 되돌리기 위해서는 마지막 단어를 ‘Enabled’로 변경하세요.


7.37 문자열 내부에서 왜 백슬래쉬가 이상하게 작동하나요?

이 질문은 종종 파일명과 관계되어 올라오곤 하지만 (윈도우즈에서 파일명을 어떻게 사용해야 하나요?를 살펴보세요), 만약 어떤 특정 문자들에 뒤이어 일어나지 않는 이상 문자열로 단일 ‘\’ 문자를 넣을 수 없는 것처럼 보일때 불평이 나오곤 합니다.

이를 이해하기 위해서는ㄴ 문자열(character strings)와 문자열의 리프레젠테이션(represenation of character strings)를 구분해야만 합니다. 대부분의 경우에는 R에서의 리프레젠테이션(representation)은 단순히 어느쪽이 끝이던지 작은 따옴표 또는 큰 따옴표가 함께 사용된 문자열입니다. 그러나, 이런 방법으로 사용할 수 없는 문자열들이 있습니다. 이러한 것에 해당하는 것은 따옴표 문자를 포함하고 있는 문자열들입니다.

> str <- "This \"text\" is quoted"
> str
[1] "This \"text\" is quoted"
> cat(str, "\n")
This "text" is quoted

이스케이프 시퀀스(escape sequences) 문자인 ‘"’와 ‘ ’은 큰 따옴표와 개행을 나타냅니다. print() 또는 프롬프트에서 이름을 입력하여 텍스트 문자열을 출력하는 것 역시 이스케이프 시퀀스를 이용합니다. 그러나, cat()함수는 문자열 그대로를 보여줄 것입니다. ‘"\n"’은 두개가 아닌 하나의 문자임을 알아두시길 바랍니다. 백슬래쉬는 실제로 문자열내에 포함되는 것이 아니고 단지 프린트된 리프레젠테이션에서 생성된 것 뿐입니다.

> nchar("\n")
[1] 1
> substring("\n", 1, 1)
[1] "\n"

어떻게 백슬래쉬를 문자열 안에 표현할 수 있나요? 이렇게 하기 위해서는 이스케이프 문자를 피해야만 합니다. 즉, 백슬래쉬를 두번 사용해야 합니다.

> cat("\\n", "\n")
\n

레귤러 익스프레이션 매칭 (regular expression matching)을 이용하는 종류의 일부 함수들은 백슬래쉬 메카니즘에 의하여 피해질 필요가 있는 메타문자들(metacharacters)들을 사용합니다. 그러한 경우에는 한개의 문자를 표현하기 위해서 4개의 백슬래쉬를 써야 할 경우도 있습니다.

2.4.1Rkwlsms ‘\p’와 같은 알려지지 않는 이스케이프 문자들은 ‘p’로 에러의 출력없이 해석되었습니다. 현재 버전의 R은 경고를 표시합니다.


7.38 에러바 또는 신뢰구간은 어떻게 표시할 수 있나요?

특정한 종류의 플랏들에 대해서 에러바를 보여주는 일부 함수들이 있습니다. agricolae 패키지내의 bar.err() 함수, gplots 패키지내의 plotCI() 함수, plotrix 패키지내의 plotCI()brkdn.plot() 함수, psych 패키지내의 error.bars(), error.crosses(), 그리고 error.bars.by() 함수가 있습니다. 이러한 유형의 함수 중 plotCI()과 같은 몇몇 함수들은 dispersion(분산)을 계산해주고, bar.errbrkdn.plot와 같은 것들은 원래의 값들 (raw values)로부터의 dispersion measure(분산 측도)를 계산해주며, error.bars와 같은 것들은 두가지 모두를 제공합니다. plotrix 패키지내에 있는 dispersion 함수와 같은 것들은 에러바들만을 보여주기도 합니다. 위에서 언급한 함수들의 대부분은 에러바를 그리기 위해서 base graphics 패키지 내에 있는 arrows()를 사용합니다.

위에서 언급한 함수 모두는 base graphics 시스템 (즉, base 배포에 있는 graphics 패키지를 이용한 그래픽 시스템)을 이용합니다. grid와 lattice 그래픽 시스템들 또한 에러바를 보여주는데 필요한 특정한 함수들을 가지고 있습니다. 예를들면, grid 패키지내의 grid.arrow() 함수와 ggplot2 패키지 내의 geom_errorbar(), geom_errorbarh(), geom_pointrange(), geom_linerange(), geom_crossbar(), 그리고 geom_ribbon()함수등입니다. 라띠스 시스템에서는 Hmisc 패키지에 있는 Dotplot() 또는 xYplot() 함수들, latticeExtra 패키지에 있는 segplot() 함수가 에러바를 보여줄 수 있습니다.


7.39 두 개의 y-축을 가진 플롯을 어떻게 생성하나요?

Creating a graph with two y-axes, i.e., with two sorts of data that are scaled to the same vertical size and showing separate vertical axes on the left and right sides of the plot that reflect the original scales of the data, is possible in R but is not recommended. The basic approach for constructing such graphs is to use par(new=TRUE) (see ?par); functions twoord.plot() (in the plotrix package) and doubleYScale() (in the latticeExtra package) automate the process somewhat.


7.40 함수의 소스코드에 어떻게 접근할 수 있나요?

In most cases, typing the name of the function will print its source code. However, code is sometimes hidden in a namespace, or compiled. For a complete overview on how to access source code, see Uwe Ligges (2006), “Help Desk: Accessing the sources”, R News, 6/4, 43–45 (https://CRAN.R-project.org/doc/Rnews/Rnews_2006-4.pdf).


7.41 절편이 없는 선형모형을 적합한 뒤 summary()를 이용하면 R^2의 추정치가 왜 이상하게 나오나요?

?summary.lm에 설명되어 있는 것과 같이 절편이 0일때 (즉, y~x-1 또는 y~x+0 이라고 사용하는 경우), summary.lm()은 다음의 포뮬러를 사용합니다. R^2 = 1 - Sum(R[i]^2) / Sum((y[i])^2) 위의 포뮬러는 다음의 일반적인 포뮬러와 다릅니다. R^2 = 1 - Sum(R[i]^2) / Sum((y[i] - mean(y))^2). 여기에는 다음과 같은 몇 가지의 이유들이 있습니다:

만약 x=0이면 E[Y]=0이라는 것을 미리 알고 있다면 적합된 직선에 비교해야 할 ‘null’ 모델은 모든 곳에서 E[Y]=0인, 즉 x가 어떠한 분산도 설명할 수 없는 모델입니다 (만약 x=0일 때 E[Y]=0이라는 것을 사전에 모른다면 원점을 지나는 직선에 적합하는 것은 아마도 하지 말아야 할 것입니다).


7.42 보시다시피 왜 R은 메모리를 풀어주지 않나요?

종종 리눅스를 이용하는 사용자들은 “R 내부의 객체들을 지우고 gc()를 실행하여 보니 ps/top에 따르면 R 프로세스가 많은 양의 메모리를 사용하는 것으로 보인다”라는 의미와는 다른 의미로 질문이 되어집니다.

이것은 운영체제가 메모리를 인공적으로 할당하는 방법입니다. 일반적으로 운영체제가 사용되지 않은 모든 메모리를 풀어줄 수 없습니다. 극단적인 경우에, 만약 R이 거의 모든 메모리를 자유롭게 할지라도 운영체제는 자체 설계 때문에 이들 중 어떤 것이라도 풀수 없습니다. 따라서, pstop과 같은 도구들은 R이 메모리를 아예 사용하지 않을지라도 R 프로세스에 의하여 사용되어진 상주된 RAM의 실질적인 양을 보고하게 됩니다. 일반적으로 이러한 도구들은 프로세스의 실제 메모리 사용을 보고 하지 않고 운영체제가 해당 프로세스를 위하여 예약해 둔 것을 보고 합니다.

간단히 말하면 이는 운영체제 내의 메모리 할당기(memory allocator)의 한계이며 이것과 관련하여 R이 할 수 있는 것은 아무것도 없습니다. 그 공간은 R이 나중에 물어볼 것이라는 기대하에 단순히 운영체제에 잡혀있습니다. 다음의 내용은 어떻게 이것이 발생되는지에 대한 다소 심도있는 답변을 줍니다.

Most systems use two separate ways to allocate memory. For allocation of large chunks they will use mmap to map memory into the process address space. Such chunks can be released immediately when they are completely free, because they can reside anywhere in the virtual memory. However, this is a relatively expensive operation and many OSes have a limit on the number of such allocated chunks, so this is only used for allocating large memory regions. For smaller allocations the system can expand the data segment of the process (historically using the brk system call), but this whole area is always contiguous. The OS can only move the end of this space, it cannot create any “holes”. Since this operation is fairly cheap, it is used for allocations of small pieces of memory. However, the side-effect is that even if there is just one byte that is in use at the end of the data segment, the OS cannot release any memory at all, because it cannot change the address of that byte. This is actually more common than it may seem, because allocating a lot of intermediate objects, then allocating a result object and removing all intermediate objects is a very common practice. Since the result is allocated at the end it will prevent the OS from releasing any memory used by the intermediate objects. In practice, this is not necessarily a problem, because modern operating systems can page out unused portions of the virtual memory so it does not necessarily reduce the amount of real memory available for other applications. Typically, small objects such as strings or pairlists will be affected by this behavior, whereas large objects such as long vectors will be allocated using mmap and thus not affected. On Linux (and possibly other Unix-like systems) it is possible to use the mallinfo system call (also see the mallinfo package) to query the allocator about the layout of the allocations, including the actually used memory as well as unused memory that cannot be released.


7.43 어떻게 R에서 안전한 HTTPS 다운로드를 활성화 할 수 있습니까?

When R transfers files over HTTP (e.g., using the install.packages() or download.file() function), a download method is chosen based on the download.file.method option. There are several methods available and the default behavior if no option is explicitly specified is to use R’s internal HTTP implementation. In most circumstances this internal method will not support HTTPS URLs so you will need to override the default: this is done automatically for such URLs as from R 3.2.2.

R versions 3.2.0 and greater include two download methods ("libcurl" and "wininet") that both support HTTPS connections: we recommend that you use these methods. The requisite code to add to .Rprofile or Rprofile.site is:

options(download.file.method = "wininet", url.method = "wininet")     (Windows)
options(download.file.method = "libcurl", url.method = "libcurl")     (Linux and OS X)

(Method "wininet" is the default on Windows as from R 3.2.2.)

Note that the "libcurl" method may or may not have been compiled in. In the case that it was not, i.e.. capabilities("libcurl") == FALSE, we recommend method "wget" on Linux and "curl" on OS X. It is possible that system versions of "libcurl", wget or curl may have been compiled without HTTPS support, but this is unlikely. As from R 3.3.0 "libcurl" with HTTPS support is required except on Windows.


8 R 프로그래밍(Programming)


8.1 summary 메소드를 어떻게 작성해야 하나요?

만약 "foo"라는 클래스에 대한 summary 메소드를 만들고 싶다면, summary.foo()는 아무것도 출력해서는 안됩니다. 그러나, 클래스의 객체 "summary.foo"를 반환해야 하며, summary의 정보를 보기 좋게 출력해주며 이 객체를 보이지 않게 반환하는 print.summary.foo()라는 메소드를 작성해야 합니다. 이러한 접근은 요약정보를 출력하는 summary.foo() 보다 선호됩니다. 그 이유는 때때로 함수 또는 유사한 곳의 내부에서 summary()에 의하여 계산된 결과를 사용할 필요가 때때로 있기 때문입니다. 그런 경우에 메소드 작성자는 어떠한 것도 출력되기를 원하지 않을 것입니다.


8.2 동적으로 로드된 코드를 어떻게 디버그 할 수 있나요?

대략적으로 말하면, 디버거 내에서 R을 시작할 필요가 있고, 코드를 로드하고, 인터럽트(interrupt)를 보내고, 브레이크포인트(breakpoint)을 설정해야만 합니다.

Writing R Extensions 문서에서 “Finding entry points in dynamically loaded code” 섹션을 참고하시길 바랍니다. 이 매뉴얼은 R 배포에 포함되어 있습니다, see What documentation exists for R?.


8.3 디버깅을 할 때 어떻게 R 객체들을 점검할 수 있나요?

가장 편리한 방법은 심볼릭 디버거(symbolic debugger)로부터 R_PV를 호출하는 것입니다.

Writing R Extensions 문서에서 “Inspecting R objects when debugging” 섹션을 참고 하십시요.


8.4 어떻게 해야 컴파일 플래그를 변경할 수 있나요?

R로 dynloading하기위한 C 코드 파일이 있지만, 기본값(R이 빌드되었을때 정해놓은)이 아닌 컴파일레이션 플래그들을 가지고 있는 R CMD SHLIB를 사용하고 싶다고 가정합니다.

R 2.1.0 부터 사용자는 디폴트 플래그를 덮어쓰기 위하여 $HOME/.R내에 있는 개인 Makevars 설정파일을 제공합니다. See section “Add-on packages” in R Installation and Administration.

이전 버전의 R에서는 개인설정을 반영하기 위하여 R_HOME/etc/Makeconf 파일을 변경할 수 있거나, (최소한 GNU Make를 이용하는 시스템들에서) 환경변수 MAKEFLAGS를 이용하여 값들을 덮어 쓸 수 있었습니다. Writing R Extensions 문서에서 “Creating shared objects” 섹션을 참고 하십시요.


8.5 어떻게 S4 메소드를 디버그 할 수 있나요?

브라우저로 호출을 추가하기 위하여 인자 signature=와 함께 trace() 함수를 이용하거나 상응하는 서명에 대해서 디스패치될 다른 코드를 이용하세요. 더 자세한 내용은 ?trace를 참조하세요.


9 R 버그(Bugs)


9.1 버그가 무엇인가요?

만약 R이 정의되어 있는 방식대로 작동하지 않거나, 운영체제로부터의 프로그램에 문제가 있다 (디스크가 꽉 찼다는 것과 반대)는 에러메시지와 함께 프로그램이 죽는다면 이는 확실히 버그입니다. 만약 .C(), .Fortran(), .External(), 또는 .Call() (또는 .Internal()), 작성한 함수내에서 자기자신을 호출할때, 잘못된 인자유형을 사용하면 R은 작동하지 않을 수도 있습니다. 이것은 버그가 아닙니다.

명령을 수행시 명령이 끝나지 않고 계속 지속되는 것은 버그일 수도 있으나, 이것이 정말 R의 잘못인지를 반드시 확인해 보아야 합니다. 일부 명령어들은 단순히 오랜 시간이 걸릴 수도 있기 때문입니다. 만약 입력이 빨리 프로세스 되어야 한다는 것을 명백히 알고 있다면, 버그로 보고하시길 바랍니다. 만약에 명령어가 오래 걸릴지 안 걸릴지를 확신할 수 없다면 도움을 청하거나 매뉴얼을 읽어보면서 이를 알아내길 바랍니다.

만약 익숙한 명령어가 정상적으로 작동해야 할 경우에 에러메시지를 발생시킨다면, 이것은 아마도 버그일 것입니다. 만약 명령어가 잘못된 작업을 수행한다면, 이는 버그입니다. 그러나, 사용자는 반드시 무엇이 수행되어야 하는지를 반드시 알고 있어야 합니다. 만약 명령어가 익숙한 것이 아니라면 또는 어떻게 명령어가 작동되는가를 정확히 모른다면, 실제로 정상적으로 작동하는 것일 수도 있습니다. 예를들면, 일부 사용자들은 때때로 R의 수학적 연산에 버그가 있다고 생각합니다. 그러나, 이는 finite-precision arithmetic work를 이해하지 못하기 때문입니다. 결론을 내리기 전에 문제를 확실히 알고있는 누군가에게 보여주길 바랍니다. 예를들어 0.28 * 100 != 28 또는 0.1 + 0.2 != 0.3과 같은 것은 버그가 아닙니다. 더 자세한 사항은 See 왜 R은 이 숫자들이 서로 같다고 하지 않는 것인가요?를 참고해주세요.

마지막으로, 명령어의 계획된 정의가 통계분석에 가장 잘 맞는 것은 아닙니다. 이것은 매우 중요한 문제이기도 한데, 이는 또한 문제에 대한 판단의 문제이기도 합니다. 또한, 이들은 이전에 존재하는 기능들에 대해서 모르기 때문에 내리는 결론이기도 합니다. 이러한 종류의 문제에 대해서는 일반적인 방법으로 문서를 확인하고, 이를 제대로 이해했다고 확신한뒤, 원하는 무엇인가를 이용가능하지 않다는 것을 확실하게 알기전까지는 불평하지 않는 것이 좋습니다. 만약 매뉴얼을 정독한 후에도 명령어가 어떻게 무엇을 수행해야 하는지를 정확히 이해할 수 없다면, 이는 매뉴얼에 버그가 있음을 의미합니다. 매뉴얼의 역할은 모든 것을 확실히 보여주는 것입니다. 프로그램 버그도 중요하지만 문서의 버그를 보고하는 것도 중요합ㄴ디ㅏ. 그런데, introductory documentation은 심각하게 불충분하다는 것을 알고 이미 알고 있기 때문에 이것을 보고할 필요는 없습니다.

만약 함수의 온라인 인자목록이 매뉴얼과 일치하지 않는다면, 둘 중에 하나가 잘 못된 것이므로 버그로 보고해 주시길 바랍니다.


9.2 버그를 보고하는 방법

버그가 있다고 판단될때, 이것을 보고하는 것도 중요하고, 어떻게 잘 보고하는가도 중요합니다. 가장 좋은 방법은 쉘 커맨드에서 R을 입력하면서부터 문제가 발생한 부분까지의 사용된 명령어들에 대한 설명을 제공하는 것입니다. 항상 사용하는 R의 버전, 사용기기, 운영체제를 함께 알려주시길 바랍니다. 이들에 대한 정보는 version이라고 입력하면 출력됨을 확인할 수 있습니다.

버그를 보고할 때 가장 중요한 원칙은 가설이나 분류를 하지 않고 실제 일어난 사실들만을 보고 하는 것입니다. 사실만을 보고하는 것이 더 쉬움에도 불구하고, 많은 분들은 이러한 사실이 왜 일어났는가를 설명하곤 합니다. 만약 이러한 설명들이 R이 어떻게 구현되었는가에 대한 추측에 기초한 것이라면, 쓸모가 없을 것입니다. 그 이유는 그러한 추측이 나오게 된 어떤 사실들을 밝혀내야만 하기 때문입니다. 때때로 이것은 불가능합니다. 그러나, 대부분의 경우에는 문제를 고치려고 노력하는 사람에게는 불필요한 일입니다.

예를들어, 꽤 큰 크기의 데이터셋을 가지고 있다고 가정하고, 다음과 같은 명령어를 입력합니다.

R> data.frame(x, y, z, monday, tuesday)

이것은 절대로 반환되지 않습니다. data.frame()이 큰 데이터셋에서 실패했다고 보고하지는 말아 주세요. 아마도 변수명이 요일로 되어 있을 때 실패하는 것일수도 있습니다. data.frame()이 큰 데이터에 대해 실패했다고 보고하지 마십시오. 만약 정말 그러하다면 다른 사람들이 보고되어진 것을 보았을때 요일명이 아닌 변수명을 이용하여 아무런 문제가 일어나지 않는 것을 확인할 것입니다.

혹은 마지막으로 사용한 명령어가 내부 데이터 구조에 오류를 발생시키고 그 이후부터 data.frame() 명령어가 실패하게 되는 원인을 가진 버그를 가졌던 "["()에 대한 메소드일 수도 있기 때문입니다. 이것은 왜 어떤 명령어들이 (시작파일부터) 이전에 입력되었는가를 알아야 하는 이유이기도 합니다.

It is very useful to try and find simple examples that produce apparently the same bug, and somewhat useful to find simple examples that might be expected to produce the bug but actually do not. If you want to debug the problem and find exactly what caused it, that is wonderful. You should still report the facts as well as any explanations or solutions. Please include an example that reproduces (e.g., https://en.wikipedia.org/wiki/Reproducibility) the problem, preferably the simplest one you have found.

--vanilla 옵션과 함께 R을 실행하는 것은 버그를 분리해 내는데 도움을 줄 것입니다. 이것은 사이트 프로파일과 저장된 데이터 파일들이 읽혀지지 않도록 합니다.

Before you actually submit a bug report, you should check whether the bug has already been reported and/or fixed. First, try the “Show open bugs new-to-old” or the search facility on https://bugs.R-project.org/. Second, consult https://svn.R-project.org/R/trunk/doc/NEWS.Rd, which records changes that will appear in the next release of R, including bug fixes that do not appear on the Bug Tracker. Third, if possible try the current r-patched or r-devel version of R. If a bug has already been reported or fixed, please do not submit further bug reports on it. Finally, check carefully whether the bug is with R, or a contributed package. Bug reports on contributed packages should be sent first to the package maintainer, and only submitted to the R-bugs repository by package maintainers, mentioning the package in the subject line.

버그 리포트는 함수 bug.report()을 이용하여 생성할 수 있습니다. 이것은 http://bugs.R-project.org/이라는 웹페이지를 열어줄 것입니다. 사용자 기여패키지(contributed package)에 대해서는 패키지의 버그 트래커 웹 페이지 또는 패키지 관리자에게 이메일을 작성할 수 있도록 도와줄 것입니다.

wishlist’라고 라벨과 함께 R의 기능강화에 관한 제안들을 위한 버그저장소 섹션이 있습니다. 제안사항들은 버그를 보고하는 것과 같은 방법으로 할 수 있으나, 제목에 반드시 이것은 wishlist 이지 버그리포트가 아니라는 것을 명시해주셔야 합니다. 예를들면, ‘Wishlist:’ 라고 시작해 주시면 됩니다.

R의 Windows 포트에 대한 조언 및 제안사항들은 R-windows@R-project.org로 보내져야 합니다.

Corrections to and comments on message translations should be sent to the last translator (listed at the top of the appropriate ‘.po’ file) or to the translation team as listed at https://developer.R-project.org/TranslationTeams.html.


10 감사의 말씀(Acknowledgements)

R 시스템에 대하여 로버트(Robert)와 로스(Ross)에게 감사의 뜻을 전달하며, 이 시스템이 확장되도록 도와준 패키지 작성자 및 포터(porters)들에게 또한 감사드립니다.

특히 본 FAQ 문서가 발전될 수 있도록 조언을 아끼지 않은 Doug Bates, Peter Dalgaard, Paul Gilbert, Stefano Iacus, Fritz Leisch, Jim Lindsey, Thomas Lumley, Martin Maechler, Brian D. Ripley, Anthony Rossini, 그리고 Andreas Weingessel에게 감사드립니다.

더 많은 내용들이 추가될 것입니다…