큰 R 프로그램을 구성하는 방법?


161

복잡한 R 프로젝트를 수행하면 스크립트가 길고 혼란스러워집니다.

내 코드가 항상 즐겁게 사용할 수 있도록 채택 할 수있는 몇 가지 방법은 무엇입니까? 나는 같은 것들에 대해 생각하고있다

  • 소스 파일에 함수 배치
  • 다른 소스 파일로 무언가를 나눌 때
  • 마스터 파일에 있어야 할 것
  • 기능을 조직 단위로 사용 (R이 전역 상태에 액세스하기 어려운 경우 가치가 있는지 여부)
  • 들여 쓰기 / 줄 바꿈 관행.
    • 치료 ({?
    • 1) 또는 2 줄에)} 같은 것을 넣습니까?

기본적으로 큰 R 스크립트를 구성하기위한 규칙은 무엇입니까?


12
커뮤니티 위키가되어야합니다
SilentGhost

ProjectTemplate패키지 를보고 싶을 수도 있습니다 .
ctbrown

답변:


71

표준 답변은 패키지를 사용 하는 것입니다. 웹에서 다른 자습서는 물론 Writing R Extensions 설명서를 참조하십시오 .

그것은 당신에게 제공

  • 주제별로 코드를 구성하는 준 자동 방법
  • 도움말 파일을 작성하여 인터페이스에 대해 생각할 것을 강력히 권장합니다.
  • 통해 많은 위생 검사 R CMD check
  • 회귀 테스트를 추가 할 수있는 기회
  • 네임 스페이스를위한 수단뿐만 아니라

source()코드를 실행 하면 실제로 짧은 스 니펫에 효과적입니다. 내부 리포지토리 용 내부 패키지를 작성할 수 있으므로 게시 할 계획이 없더라도 다른 모든 것은 패키지에 있어야합니다.

'편집 방법'부분에 대해서는 R Internals 매뉴얼 에 섹션 6의 우수한 R 코딩 표준 이 있습니다. 그렇지 않으면 Emacs의 ESS 모드 에서 기본값을 사용하는 경향이 있습니다 .

2008-Aug-13 업데이트 : David Smith가 Google R 스타일 가이드에 대해 블로그에 올렸습니다 .


8
소스 트리 / 분석을 "유기적으로"성장시키고 있다면 이것이 어렵거나 번거롭지 않습니까? 코드에서 실수를 발견하면 (새로운 문제 영역을 탐색하는 동안 일반적 임) (i) 소스를 수정해야합니다. (ii) 패키지를 다시 설치; (iii) 작업 공간에 다시로드 하시겠습니까? 이미로드 된 패키지를 다시로드하기 위해 라이브러리 (...)를 호출하는 방법이 있습니까 (위 3 단계)? 작업 공간을 종료하지 않아도 R을 다시 시작한 다음 라이브러리 / 패키지를 다시로드하여 올바른지 확인하십시오.
Steve Lianoglou

1
R 코딩 스타일에 대한 인터넷 검색을 시도합니다.
hadley

3
@SteveLianoglou 나는 이것이 오래되었다는 것을 알고 있지만 Hadley의 devtools 패키지는 모든 코드를 매우 쉽게 다시로드 할 수있게합니다.
Dason

1
이 블로그 게시물 베어 뼈를 첫 번째 패키지를 빌드하는 정말 좋은 빠른 튜토리얼을 A (내 생각)을 제공합니다 hilaryparker.com/2014/04/29/writing-an-r-package-from-scratch
panterasBox

1
여기에 링크를하고있다 구글 R 스타일 가이드
데니스 Rasulev

51

나는 다른 기능을 자신의 파일에 넣는 것을 좋아합니다.

그러나 나는 R의 패키지 시스템을 좋아하지 않는다. 사용하기가 다소 어렵습니다.

파일 기능을 환경 내에 배치하고 (다른 모든 언어는 "네임 스페이스"라고 부르는) 대체 파일을 선호합니다. 예를 들어, 'util'기능 그룹을 다음과 같이 만들었습니다.

util = new.env()

util$bgrep = function [...]

util$timeit = function [...]

while("util" %in% search())
  detach("util")
attach(util)

이것은 모두 util.R 파일에 있습니다 . 당신이 그것을 소싱 할 때, 당신은 호출 할 수있는 환경 '유틸리티'를 얻습니다 util$bgrep(). 더 나아가서, 그 attach()부름은 그렇게 정당 bgrep()하고 그러한 일을 직접적으로 만듭니다. 이러한 함수를 모두 자신의 환경에 두지 않은 경우 통역사의 최상위 네임 스페이스 (오른쪽 네임 스페이스)를 오염시킵니다.ls() 됩니다.

모든 파일이 모듈 인 Python의 시스템을 시뮬레이션하려고했습니다. 그것은 더 나을 것이지만 이것은 괜찮은 것 같습니다.


고마워요, 브렌든 매우 유용합니다. while 루프는 어떤가요? if (! ( "util"% in % search ())) attach (util)의 문제점
Dan Goldstein

2
소스를 수정하고 싶다면 source ( "util.R")를 반복해서 수행 할 수 있습니다.
Brendan OConnor

실제로 while 루프가 필요하지 않습니다. detach (util) 만 있으면됩니다. 아직로드되지 않은 경우 오류가 발생하는지 기억할 수 없지만 가장 안전하고 작동합니다. 제안을 환영합니다.
Brendan OConnor

1
기능별 환경을 만들고 연결하는 것이 나를위한 길입니다. 또 다른 방법은 (더 모듈화와) 다른 방법으로 같은 일을 달성하기 위해 사용하는 것입니다 sys.source: MyEnv <- attach(NULL, name=s_env); sys.source(file, MyEnv). 심지어 시작할 sys.source2때 (같은 환경에서) 같은 이름의 환경이 이미 있는지 찾아보고 새로운 환경을 만드는 대신이를 공급 하는 함수 를 선언 합니다. 개인 기능을 빠르고, 쉽고, 체계적으로 추가 할 수 있습니다 :-)
Antoine Lizée

5
오늘 이것을 보았고 패키지 대안에 적용됩니다 : github.com/klmr/modules
ctbrown

34

프로그래머라면 특히 분명하게 들릴지 모르지만, 논리적이고 물리적 인 코드 단위에 대한 생각은 다음과 같습니다.

이것이 귀하의 경우인지 모르겠지만 R에서 일할 때 큰 복잡한 프로그램을 염두에 두지 않습니다. 나는 보통 하나의 스크립트에서 시작하여 코드를 논리적으로 분리 가능한 단위로 분리하며 종종 함수를 사용합니다. 데이터 조작 및 시각화 코드는 자체 기능 등에 배치됩니다. 이러한 기능은 파일의 한 섹션에 그룹화됩니다 (맨 위의 데이터 조작, 시각화 등). 궁극적으로 스크립트를보다 쉽게 ​​유지 관리하고 결함 비율을 낮추는 방법에 대해 생각하고 싶습니다.

미세하고 거칠게 기능을 만드는 방법은 다양하고 다양한 규칙이 있습니다. 예를 들어 15 줄의 코드 또는 "이름으로 식별되는 하나의 작업을 수행하는 기능"등이 있습니다. 마일리지는 다양합니다. . R은 참조 별 호출을 지원하지 않기 때문에 일반적으로 데이터 프레임이나 유사한 구조를 전달할 때 함수를 너무 세분화하는 방법이 다양합니다. 그러나 이것이 R을 처음 시작할 때 바보 같은 성능 오류에 대한 과도한 보상 일 수 있습니다.

논리 단위를 자체 물리 단위 (예 : 소스 파일 및 패키지와 같은 더 큰 그룹화)로 추출 할 때는 언제입니까? 두 가지 경우가 있습니다. 첫째, 파일이 너무 커지고 논리적으로 관련이없는 단위 사이를 스크롤하면 성가신 일입니다. 둘째, 다른 프로그램에서 재사용 할 수있는 기능이 있다면. 일반적으로 데이터 조작 기능과 같은 그룹화 된 단위를 별도의 파일에 배치하여 시작합니다. 그런 다음 다른 스크립트에서이 파일을 제공 할 수 있습니다.

함수를 배포하려면 패키지에 대한 생각을 시작해야합니다. 프로덕션에 R 코드를 배포하거나 다양한 이유로 다른 사람들이 재사용하기 위해 배포하지 않습니다 (간결하게 : 조직 문화는 다른 언어를 선호하고 성능, GPL 등). 또한 소스 파일 모음을 지속적으로 수정하고 추가하는 경향이 있으며 변경을 할 때 패키지를 다루지 않습니다. 따라서 더 자세한 내용은 Dirk와 같은 다른 패키지 관련 답변을 확인해야합니다.

마지막으로, 귀하의 질문이 R에만 국한되는 것은 아니라고 생각합니다. Steve McConnell의 Code Complete를 읽고 이러한 문제와 코딩 방법에 대한 많은 지혜가 담긴 코드를 읽는 것이 좋습니다.


3
매우 도움이되는 의견입니다. 감사합니다. 저는 프로그래머이지만 다른 사람들과 체크인하는 것이 좋습니다. "R이 참조 별 호출을 지원하지 않기 때문에 일반적으로 함수를 너무 세밀하게 만드는 것에주의해야합니다"라고 들립니다. ReadData ()와 같은 함수를 작성하는 데 익숙합니다. CleanData (); AnalyzeData (); GraphData (); 그리고 R은 그것을 성가 시게 만듭니다. 다른 언어로 함수를 사용하는 방식으로 "소스"를 사용해야한다는 생각에 깨어났습니다.
Dan Goldstein

2
네 말이 맞아, 댄 데이터 셋 준비 작업에 "소스"를 사용한다는 사실을 알았으므로 실제 분석이 수행되는 다른 스크립트에서 준비된 data.frame을 사용할 수 있습니다. 쉘 스크립팅과 같은 다른 언어에 비해 이상한 느낌이 들기 때문에 이것이 좋은 습관인지 확실하지 않았습니다. 메모를 비교하는 것이 좋습니다. :)
ars

좋은 답변과 의견. R에서 특히 성가신 것으로 나타났습니다. 재사용 가능한 함수를 작성하기가 어려운 특정 형식의 데이터로 작업하는 경우가 많기 때문입니다. 따라서 재사용 할 수 없다는 것을 알고 있더라도 훌륭한 기능 코드를 작성합니까, 아니면 큰 객체로 효율성을 높이기 위해 빠르고 불쾌한 절차 적 코드를 작성합니까? 약간의 딜레마. R은 참조에 의한 호출로 절대적으로 멋질 것입니다.
naught101

글쎄, 그것은 일종의 할 수 있지만 효율성은 없습니다 ...
naught101

19

Dirk의 조언에 동의합니다! 간단한 스크립트에서 문서화 된 패키지로 프로그램을 구성하는 IMHO는 R에서 프로그래밍하는 경우 쓰기를 위해 Word에서 TeX / LaTeX로 전환하는 것과 같습니다. 매우 유용한 R 패키지 만들기 : Friedrich Leisch 의 자습서 를 살펴 보는 것이 좋습니다 .


6
패키지는 매력적으로 보입니다. 그러나 나는 그들이 과잉일지도 모른다고 걱정했다. 범용 코드를 작성하지 않습니다. 내가하고있는 대부분의 일은이 가설을 테스트하고, 가설을 테스트하고, 이것을 플롯하고, 플롯 매개 변수를 조정하고, 플롯하고, 데이터를 재구성하고, 플롯하는 것입니다. 일단 완료되면 다시는 실행되지 않는 작업을 수행하고 있습니다.
Dan Goldstein

1
이 경우 Sweave를 살펴 봐야합니다. R 코드와 LaTeX를 결합합니다. 따라서 분석과 보고서 소스가 함께 있습니다.
Thierry

15

나의 간결한 답변 :

  1. 일반적인 충분한 출력 및 입력을 식별하여 기능을 신중하게 작성하십시오.
  2. 전역 변수의 사용을 제한하십시오.
  3. S3 객체 및 적절한 경우 S4 객체를 사용하십시오.
  4. 특히 함수가 C / Fortran을 호출 할 때 패키지에 함수를 넣습니다.

R은 프로덕션 환경에서 점점 더 많이 사용되므로 재사용 가능한 코드의 필요성은 이전보다 훨씬 큽니다. 통역사가 이전보다 훨씬 더 견고하다는 것을 알았습니다. R이 C보다 100-300x 느리다는 것은 의심의 여지가 없지만 일반적으로 병목 현상은 몇 줄의 코드에 집중되어 있으며 C / C ++에 위임 할 수 있습니다. 데이터 조작 및 통계 분석에서 R의 강점을 다른 언어로 위임하는 것은 실수라고 생각합니다. 이러한 경우 성능 저하가 적고 어쨌든 개발 노력을 절감 할 가치가 있습니다. 실행 시간만으로도 문제가되지 않으면 모두 어셈블러를 작성해야합니다.


11

패키지를 작성하는 방법을 알아 내려고했지만 시간을 투자하지 않았습니다. 각각의 미니 프로젝트에 대해 모든 하위 수준 기능을 'functions /'라는 폴더에 보관하고 명시 적으로 만든 별도의 네임 스페이스로 소싱합니다.

다음 코드 줄은 검색 경로에 "myfuncs"라는 환경이 아직없는 경우 (연결을 사용하여) 환경을 만들고 내 'functions /'디렉토리의 .r 파일에 포함 된 함수로 채 웁니다 ( sys.source). 나는 보통이 줄들을 메인 스크립트의 맨 위에 놓는다. "사용자 인터페이스"는 높은 수준의 함수 (낮은 수준의 함수 호출)가 호출되는 "사용자 인터페이스"를 의미한다.

if( length(grep("^myfuncs$",search()))==0 )
  attach("myfuncs",pos=2)
for( f in list.files("functions","\\.r$",full=TRUE) )
  sys.source(f,pos.to.env(grep("^myfuncs$",search())))

변경할 때 항상 같은 줄을 사용하여 소스를 변경하거나 다음과 같은 것을 사용할 수 있습니다

evalq(f <- function(x) x * 2, pos.to.env(grep("^myfuncs$",search())))

생성 한 환경에서 추가 / 수정을 평가합니다.

내가 아는 것은 끔찍한 일이지만 그것에 대해 너무 공식적이 될 필요는 없습니다 (그러나 패키지 시스템을 장려 할 수 있다면 장래에 그 방식으로 마이그레이션 할 것입니다).

코딩 규칙에 관해서는 이것이 미학에 관해 내가 본 유일한 것입니다 (나는 그것들을 좋아하고 느슨하게 따르지만 R에서 너무 많은 중괄호를 사용하지는 않습니다) :

http://www1.maths.lth.se/help/R/RCC/

[, drop = FALSE]와 <-의 사용에 관한 다른 "수집"이 useR에서 다양한 프레젠테이션 (보통 기조 연설)에서 제안한 것처럼! 컨퍼런스이지만,이 중 어느 것도 엄격하다고 생각하지 않습니다 ([, drop = FALSE]는 예상 한 입력을 확신하지 못하는 프로그램에 유용합니다).


6

패키지를 선호하는 다른 사람으로 나를 계수하십시오. 필자는 필요할 때 (즉, 릴리스 될 때까지) 맨 페이지와 비 네트를 작성하는 데 꽤 나쁘다는 것을 인정하지만 소스 도우를 묶는 정말 편리한 방법을 만듭니다. 또한 코드 유지 관리에 대해 진지하게 생각하면 Dirk이 제기하는 모든 점이 plya에 도달합니다.


4

동의합니다. package.skeleton () 함수를 사용하여 시작하십시오. 코드를 다시 실행할 수 없다고 생각하더라도 나중에 시간을 절약 할 수있는보다 일반적인 코드를 작성하도록 동기를 부여 할 수 있습니다.

글로벌 환경에 액세스하는 것은 권장하지 않지만 <<-연산자를 사용하면 쉽습니다.


3

아직 패키지를 작성하는 방법을 배우지 못했지만 항상 하위 스크립트를 소싱하여 구성했습니다. 클래스 작성과 비슷하지만 참여하지는 않습니다. 프로그래밍 방식으로 우아하지는 않지만 시간이 지남에 따라 분석을 작성합니다. 일단 큰 섹션이 작동하면 종종 다른 스크립트로 옮기고 작업 공간 객체를 사용하기 때문에 소스를 만듭니다. 아마도 여러 소스에서 데이터를 가져 와서 모두 정렬하고 교차점을 찾아야 할 수도 있습니다. 해당 섹션을 추가 스크립트에 넣을 수 있습니다. 그러나 "응용 프로그램"을 다른 사람에게 배포하거나 대화식 입력을 사용하려는 경우 패키지가 좋은 경로 일 수 있습니다. 연구원으로서 분석 코드를 배포 할 필요는 거의 없지만 종종 코드를 보강하거나 조정해야합니다.


이 방법을 사용했지만 그 이후로 함수와 패키지가 source ( "next_script.R")보다 낫다는 것을 깨달았습니다. 나는 여기에 썼습니다 : stackoverflow.com/questions/25273166/…
Arthur Yip

1

또한 R 대형 프로젝트를 구성하기위한 올바른 워크 플로우의 성배를 찾고있었습니다. 작년에 rsuite 라는이 패키지를 찾았 으며 확실히 내가 찾던 것이 었습니다. 이 R 패키지는 대규모 R 프로젝트의 배포를 위해 명시 적으로 개발되었지만 소규모, 중간 규모 및 대규모 R 프로젝트에 사용할 수 있다는 것을 알았습니다. 잠시 후에 실제 예제에 대한 링크를 제공하지만 먼저 R 프로젝트를 빌드하는 새로운 패러다임을 설명하고 싶습니다 rsuite.

노트. 의 제작자 또는 개발자가 아닙니다 rsuite.

  1. 우리는 RStudio에서 모든 프로젝트를 잘못하고 있습니다. 목표는 프로젝트 나 패키지를 만드는 것이 아니라 더 큰 범위가되어야합니다. rsuite에서는 가능한 모든 조합으로 표준 R 프로젝트 및 R 패키지를 보유하는 수퍼 프로젝트 또는 마스터 프로젝트를 만듭니다.

  2. R 수퍼 프로젝트를 가짐으로써 더 make낮은 수준의 R 프로젝트를 관리하기 위해 더 이상 Unix 가 필요하지 않습니다 . 상단에 R 스크립트를 사용합니다. 보여 드리겠습니다. rsuite 마스터 프로젝트를 만들면 다음 폴더 구조를 얻게됩니다.

여기에 이미지 설명을 입력하십시오

  1. 폴더 R는 프로젝트 관리 스크립트를 넣을 위치로 대체 make됩니다.

  2. 폴더 packagesrsuite수퍼 프로젝트를 구성하는 모든 패키지 가 들어있는 폴더 입니다. 인터넷에서 액세스 할 수없는 패키지를 복사하여 붙여 넣을 수도 있으며 rsuite도이를 빌드합니다.

  3. 폴더 deploymentrsuite패키지 파일에 표시된 모든 패키지 바이너리를 작성하는 위치 입니다 DESCRIPTION. 따라서, 그 자체만으로도 완전히 재현 가능한 시간을 예상 할 수 있습니다.

  4. rsuite모든 운영 체제에 대한 클라이언트와 함께 제공됩니다. 나는 그들 모두를 시험했다. 그러나 addinRStudio 용 으로 설치할 수도 있습니다 .

  5. rsuite또한 conda자체 폴더에 격리 된 설치 를 구축 할 수 있습니다 conda. 이것은 환경이 아니라 컴퓨터의 Anaconda에서 파생 된 실제 Python 설치입니다. 이것은 R과 함께 작동 SystemRequirements하므로 원하는 모든 conda 채널에서 원하는 모든 Python 패키지를 설치할 수 있습니다.

  6. 오프라인 일 때 R 패키지를 가져 오기 위해 로컬 리포지토리를 만들거나 전체를보다 빠르게 빌드 할 수도 있습니다.

  7. 원하는 경우 R 프로젝트를 zip 파일로 빌드하여 동료와 공유 할 수도 있습니다. 동료에게 동일한 R 버전이 설치되어 실행됩니다.

  8. 또 다른 옵션은 우분투, 데비안 또는 CentOS에서 전체 프로젝트의 컨테이너를 빌드하는 것입니다. 따라서 zip 파일을 프로젝트 빌드와 공유하는 대신 전체 Docker컨테이너를 프로젝트 실행 준비와 공유합니다 .

나는 rsuite완전한 재현성 을 찾기 위해 많은 실험을 해 왔으며 , 글로벌 환경에 설치되는 패키지에 의존하지 않도록한다. 패키지 업데이트를 설치하자마자 프로젝트가 작동을 멈추는 경우가 많으며, 특히 특정 매개 변수가있는 함수를 매우 구체적으로 호출하는 패키지가 작동하지 않기 때문입니다.

제가 실험을 시작한 첫 번째 것은 bookdown전자 책이었습니다. 나는 6 개월 이상 시험을 견뎌 낼 수있는 북 다운 (bookdown)을 가질만큼 운이 좋지 않았다. 그래서 내가 한 일은 원래의 북 다운 프로젝트를 rsuite프레임 워크 를 따르도록 변환하는 것 입니다. 이제 프로젝트에는 deployment폴더 에 자체 패키지 세트가 있으므로 글로벌 R 환경 업데이트에 대해 걱정할 필요가 없습니다 .

내가 한 다음 일은 기계 학습 프로젝트를 만드는 것이었지만 rsuite방해가되었습니다. 마스터, 상단에 오케스트레이션 프로젝트 및 모든 하위 프로젝트 및 패키지가 마스터의 제어를받습니다. R로 코딩하는 방식이 실제로 바뀌어 생산성이 향상됩니다.

그 후 나는이라는 새로운 패키지를 작업하기 시작했다 rTorch. 이것은 대체로 가능했다 rsuite. 생각하고 크게 할 수 있습니다.

그래도 조언 하나. 학습 rsuite은 쉽지 않습니다. R 프로젝트를 만드는 새로운 방법을 제시하기 때문에 힘들다. 첫 번째 시도에서 실망하지 말고 경사가 날 때까지 계속 등반하십시오. 운영 체제 및 파일 시스템에 대한 고급 지식이 필요합니다.

언젠가 RStudiorsuite메뉴 에서처럼 오케스트레이션 프로젝트를 생성 할 수있을 것으로 기대 합니다. 대단 할 것입니다.

연결:

RSuite GitHUb 저장소

r4ds 예약

케라 스와 빛나는 튜토리얼

현대의 다이빙 책

해석 가능 _ml-rsuite

R-rsuite를 통한 기계 학습

클라크 인트로 _ml-rsuite

hyndman-bookdown-rsuite

statistics_rethinking-rsuite

확산 벤치 마크 -rsuite

dataviz-rsuite

소매 부문 분할 교육

텔코-고객-이탈자 자습서

sclerotinia_rsuite


-7

R은 대화식 사용 및 작은 스크립트에는 적합하지만 큰 프로그램에는 사용하지 않습니다. 대부분의 프로그래밍에 주류 언어를 사용하여 R 인터페이스로 래핑했습니다.


1
큰 패키지 (예 : 프로그램)가 있습니다. 다른 언어로 다시 작성해야한다고 진지하게 제안하고 있습니까? 왜???
Eduardo Leoni

4
한 가지 고려 사항은 효율성입니다. 나는 종종 R 코드를 C ++ 코드로 다시 작성하여 100 배 더 빨랐습니다. 다른 하나는 도구 지원입니다. R은 Eclipse 또는 Visual Studio와 같은 IDE와 비교할 수있는 것이 없습니다. 마지막으로 프로그램이 매우 큰 경우 R이 적합하지 않은 비 통계 작업을 수행 할 가능성이 있습니다.
John D. Cook

2
Eclipse가 R과 상호 작용할 수있게하는 플러그인 (Stat-ET)이 있습니다. C ++가 R보다 훨씬 빠르게 작동 할 수 있다는 데 동의합니다. 그러나 R 항목을 C ++로 다시 코딩하는 데 얼마나 많은 시간이 필요합니까? 코드를 자주 재사용 할 수 없다면, 더 빠른 코드의 이점은 C ++로 코드를 다시 작성하려는 노력에 비해 가치가 없습니다.
Thierry

2
예, 절충 (생산성 v 성능)이 있습니다. 순전히 데이터 분석 / 통계 작업의 경우 R이 승리합니다. 그러나 GUI, 웹 등과 같은 다른 작업을 작성하는 경우에는 확실하지 않습니다. 우리는 종종 R에서 프로토 타입을 만들고 작업하지만 Python / C ++에서 프로덕션 코드를 배포합니다. 후자를 사용하면 다양한 작업에 대한 성능 매우 성숙하고 재사용 가능한 라이브러리 / 프레임 워크를 얻을 수 있습니다. 그러나 이것은 유동적 인 상황이며 R 생태계는 끊임없이 발전하고 있습니다.
ars

RcppR 프로그램에 C ++ 코드를 포함 하여 패키지를 사용하는 것은 매우 간단합니다. 따라서 R 코드의 특정 부분을 다시 작성하는 것이 R에 쉽게 통합 될 수 있습니다. 또한 RStudio의 등장으로 Visual Studio만큼 강력하지는 않지만 R 용 IDE가 도입되었습니다.
Paul Hiemstra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.