시뮬레이션 결과와 논문의 결과가 항상 동기화되도록하려면 어떻게해야합니까?


34

내 논문 중 하나에서 일부 수치 외에도 수치 결과를 나열합니다. 내가하고 싶은 것은 내 논문의 수치 결과가 항상 코드와 일치하는지 확인하는 것입니다. 지금은 시뮬레이션 결과의 수치 결과를 종이에 직접 복사합니다.이 결과는 매우 간단하고 기술이 적지 만 결과를 잘못 복사하거나 종이 결과와 동기화하는 것을 잊어 버릴 수 있기 때문에 오류가 발생하기 쉽습니다. 코드 출력.

논문에서 인용 한 수치 결과를 코드에서 생성 한 결과와 동기화하는 좋은 방법이 있습니까? (여기서, 나는 종이를 업데이트하고 싶을 때마다 코드를 실행하는 것이 쉽고 실용적이라고 가정합니다.) 이러한 수치 결과가 반드시 표 형식으로 적합하지는 않습니다. 때로는 원고에 표가 있지만 더 일반적으로 방정식에 숫자로 나열된 시뮬레이션 매개 변수가 있습니다 . 예를 들면 다음과 같습니다.

와이=(와이1,,와이)

여기서 초기 조건 의 요소 를 일반적인 미분 방정식 시스템을 수치 적으로 통합하는 시뮬레이션에서 사용하는 실제 매개 변수 로 대체하고 싶습니다 . 이 예제와 같은 일회성 데이터에 테이블을 사용하면 불필요한 것보다 많은 잉크가 필요합니다.와이

LaTeX 소스, Markdown, RST 등에서 문서를 "빌드"할 때마다 코드를 실행하여 빌드 프로세스를 시작합니다. 그러나 사람들이 내 시뮬레이션으로 생성 한 수치를 내 논문과 동기화하는 데 더 나은 제안이 있으면 그 말을 듣고 싶습니다.

답변:


14

일부 의견에서 알 수 있듯이이 접근 방식은 R 커뮤니티에서 오랫동안 개발되어 Sweave보다 최근 에 개발되었습니다 knitr. 분명히이 접근법은 현재 언어에 따라 다르다는 단점이 있지만, 학술 논문에서 정기적으로 사용하는 이점이 있습니다.

실제 출판물에서 Sweave 사용

  • 생물 통계학의 저널 이 제출을 장려하고, reproduciblity 편집기는 코드와 데이터를 실행하고 결과를 얻을 수있다있는 학술 논문에 Kite 마크 문자 "R"를 배치합니다.
  • 기본적으로 R- 저널 의 모든 발행물은 Sweave를 기반으로합니다.

물론 더 일반적으로 Sweave / knitr 사용자는 대부분의 저널에 최종 결과물을 제출하며, 방법이 실제로 결과를 재현한다는 개인적인 확신을 가지고 있습니다. 마찬가지로 스위프는 종종 전문적인 대화 등을위한 슬라이드를 만드는 데 사용됩니다.

유용한 기능

실제로 유용하게 사용하려면 이러한 시스템에 특정 기능이 있어야합니다. 중요한 사용자가 많기 때문에 이들 중 상당수는에서 잘 개발되어 knitr있습니다. 몇 가지 주요 사항 :

  • 캐싱. 출력을보기 위해 컴파일해야하는 markdown 또는 latex와 같은 형식으로 쓰면 결과를 캐시 할 수 없을 때 코드를 포함하여이를 불가능하게합니다. 영리한 캐싱은 성공적인 청크를 다시 실행할 필요가 없기 때문에 knitr실제로 집중적 인 코드를 디버깅 R하는 것이 pure 작업보다 훨씬 쉽습니다 .

  • 코드 표시를 토글합니다. 공식 간행물에서는 기본 코드를 출력에 표시하지 않을 수 있습니다. 한편 독자가 입력 한 내용을 정확하게보고자 할 때 출력 형식으로 결과를 생성하는 (포맷이 잘 된 구문 강조된) 코드를 표시하는 것이 종종 유용합니다.

  • 커뮤니티. 아마도 본 솔루션에 비해이 접근 방식의 가장 큰 장점은 모델에 익숙하고 개선하려는 사람들의 수입니다.

  • "가벼운 게시"또는 웹 공유를위한 도구를 포함 하여 knitr 웹 페이지 데모 에서 다른 기능의 좋은 예를 많이 찾을 수 있습니다 . 이러한 기능 중 다수는이 방법이 원고를 작성할 때만 수행하는 것이 아니라 일반적인 워크 플로와 호환되도록 돕습니다.

역사적 각주.

Knuth의 "literate programming"에 뿌리를두고 있지만, 이름에서 알 수 있듯이, literate programming은 소프트웨어 코드와 문서를 연결하는 데 중점을두기 때문에 (R 커뮤니티에서 역할이 수행되는 R 커뮤니티 Roxygen에서 다른 지점으로의 뿌리를 추적 함) 강조가 상당히 다릅니다. "리터 레이트 프로그래밍 트리").

넘어 가기

원칙적으로 대화 형 온라인 플랫폼을 사용하여 전체 문서를 편집하고 다시 컴파일하지 않고도 입력을 변경하고 출력을 볼 수있는 기능과 같은 동적 문서에서 더 많은 것을 요청할 수 있습니다. XDynDocs 는이 방향으로의 단계 일 수 있습니다.

다른 접근법

  • dexy.it을 주시하고 싶을 수도 있습니다.
  • 약간 다른 접근 방식 : http://www.runmycode.org/의 출판물과 관련된 점점 더 많은 경제 논문 호스트 코드 가 클라우드에서 분석을 다시 실행하고 사용자 정의 입력 매개 변수 또는 사용자 정의 입력 데이터를 허용합니다.

칼, 나는 한동안 당신의 웹 사이트를 따라 왔고, knitr에 대한 당신의 접근은 내 질문에 대한 영감 중 하나였습니다. Zed Shaw가 책을 사용하여 자신의 저서 Python을 어려운 방법으로 배우는 방법 ( git repo 참조)을 사용하기 때문에 잠시 동안 dexy를 따르고 있습니다. 다른 문맹 프로그래밍 방식과 달리 dexy에 대해 좋아하는 점은 코드와 텍스트가 느슨하게 결합되어 디버거를 제대로 사용할 수 있다는 것입니다.
Geoff Oxberry 2016 년

제프, 멋진 의견에 감사드립니다! Anna Nelson은 디커플링의 큰 신자입니다. R 사용자는 코드 외부화 또는 새로운 spin()기능을 사용 하여 편 직기에서 디커플링을 수행 할 수 있습니다 . 개인적으로 문맹 프로그래밍에 대한 Greg Wilson의 불만은 꽤 오래되었다고 생각합니다. 나는 그가 noweb와 같은 끔찍한 경험을 가지고 있었지만, 복잡한 디버깅은 현대 도구에는 존재하지 않습니다. 문맹 CI를 위해 doxygen을 사용하십시오. Knitr은 캐싱 및 환경 처리 덕분에 R보다 디버깅하기 쉬운 것이 있습니다.
cboettig 2016 년

20

당신이 요구하는 것은 "Executable Paper" 의 Elsivier 그랜드 도전입니다 . 많은 접근 방식이 시도되었지만 저자가 제안한 것만 큼 강력한 방법은 없습니다. 다음은 사용 된 기술의 몇 가지 예입니다.

Madagascar Project 는 접근 방식을 취하며, make 스크립트 안에서 그림과 종이를 동시에 생성하는 시뮬레이션을 실행합니다.

IPython Notebook 은 하트 컨텐츠를 읽고 그림을 작성할 때 실행할 수있는 문서를 제공합니다. (저는 플러그인, Mathematica 및 같은 방식으로 사용되는 수많은 다른 솔루션을 보았습니다)

VisTrails 는 서비스 지향 아키텍처 접근 방식을 사용하며 "제공"또는 "워크 플로우"관리자를 제공합니다. 기본적으로 후크에 코드를 등록한 후 작업을 재현하는 작업 흐름 또는 실험을 설계합니다. HPC 클러스터까지도 여러 유형의 코드에서 사용되었습니다. 이 방법을 사용하면 실험을 재생할 수 있습니다.

이러한 유형의 솔루션은 수없이 많지만 그 중 세 가지가 감동했습니다. 그것은 어려운 문제이며 우리가 실제로 해결에 가깝지 않다고 생각합니다. 우리는 사람들이 자신의 논문으로 코드를 공개하도록 할 수 없습니다. 어떻게 결과를 재현 할 수 있을까요?


비슷한 맥락에서 sweave 가 있는데 이는 내가 사용하는 것이 아니라 개념 상 흥미 롭습니다.
dmckee

마다가스카르 프로젝트는 저자 중 한 사람의 이야기를들을 때 재미있을 것 같았습니다. 나는 실제로 그것을 사용하려고하지 않았습니다.
Ken

@ dmckee : 나는 sweave와 knitr로 성공한 사람들을 알고 있습니다. Greg Wilson이 Software Carpentry에서 제공 하는 것과 같은 이유로 글을 읽고 쓸 줄 아는 프로그래밍 방식에 대해 언급 하고 있습니다. 텍스트).
Geoff Oxberry

이 목적으로 Sweave를 사용하면 매우 잘 작동하며 Lyx와 호환됩니다. 조직 모드는 훨씬 우수하며 가장 일반적인 언어를 지원합니다.
David LeBauer

13

이 문제에 다른 사람들의 솔루션을 사용하는 데 큰 성공을 거두지 못했습니다. 나는 보통 나를 위해 일하고 일을 끝내는 간단한 것을 원합니다. 이를 위해 일반적으로 모든 결과를 실행하고 출력을 구문 분석하고 그림 / 테이블을 작성하는 하나의 Python 스크립트를 작성하려고합니다.

일부 텍스트 형식의 결과를 포함하는 데이터 파일을 생성하기 위해 코드를 작성합니다. 먼저 출력 파일이 있는지 테스트하여 (예를 들어, os.path.isfile ()을 사용하는 파이썬) 스크립트에서 이러한 결과를 다시 실행하지 않아도됩니다. 결과를 다시 실행하려면 데이터 파일을 제거하십시오. 데이터 파일이 존재하면 이러한 파일의 파서를 실행합니다. 이를 위해 정규 표현식에 대한 파이썬 모듈은 매우 유용합니다.

그런 다음 파싱 된 출력에서 ​​그림 또는 테이블을 만듭니다. 라텍스 테이블의 경우 코드를 작성하여 테이블을 별도의 파일로 생성하고 (확장자 .tbl 사용) 라텍스 파일에 포함시킬 수 있습니다. 그것들은 나를 위해 1 개의 파이썬 스크립트를 사용하는 것입니다. 내가 많은 것이 있다면, 나는 어느 것이 무엇이고 무엇을하는지 궁금하게 생각합니다. 이 설명이 너무 모호한 경우 몇 가지 예를 보내 드리겠습니다.


1
나는 이미 이런 종류의 일을하고 있습니다. 그러나 내가 쓰고있는 논문에서 테이블은 데이터를 표현하는 부 자연스러운 형식 일 것입니다. 종종, 나는 실제로 초기 조건을 ODE (실제로 4-6 숫자, 쉼표로 구분) 또는 방정식 오른쪽의 일부로 숫자의 전체 행렬에 포함시키고 싶습니다. 나는 당신의 테이블 아이디어를 좋아합니다. 내가 언급 한 경우, 테이블로 형식을 다시 지정하는 것은 부자연스럽고 더 자연스러운 형식으로 데이터를 포함하고 싶습니다.
Geoff Oxberry

네이선, 예를 게시 하시겠습니까? 텍스트 파일을 git에 커밋하고 git을 사용하여 결과를 관리한다는 점을 제외하고는 동일한 접근법을 사용합니다. 그런 다음 줄거리 / 테이블을 생성하는 Python 스크립트가 있습니다. 줄거리 또는 테이블 당 하나의 스크립트가 있습니다.
Ondřej Čertík 2016 년

명령을 사용하여 쉘 스크립트의 출력을 라텍스로 직접 파이프 할 수도 있습니다 \input{|"path-to-script.py"}. 모든 매개 변수를 단일 파이썬 (또는 가장 좋아하는 언어) 파일에 넣고 명령 줄 매개 변수를 사용하여 액세스하는 것이 \input{|"path-to-script.py param-name"}좋습니다. 이 경우 시뮬레이션을 실행하기 위해 param 파일을 다른 스크립트에 포함시킬 수 있습니다. 그러나 컴파일 속도가 느려지고 다른 단점이 있습니다.
헬륨


7

더 중요한 것은 제 의견으로는 한 달 또는 1 년 안에 모든 결과를 처음부터 다시 생성하는 방법을 파악할 수 있도록하는 것입니다 (예 : 심판이 무언가를 추가하거나 수정하도록 요청할 때). 이를 위해 내가하는 일은 모든 결과를 재현하는 방법에 대한 매우 자세한 지시 사항이있는 텍스트 파일을 포함시키는 것입니다. 공동 저자와 같은 다른 사람이 시험해 보도록하여 시험해 보는 것이 가장 좋습니다. 또한이 지침 (및 모든 코드)을 심판과 독자에게 제공하는 것이 좋습니다.

다음은 예입니다 (실제로 공동 저자 인 Aron Ahmadia가 준비했습니다).


나는 그 전에 (내 자신의 정신을 위해) 해왔으며 고맙게도 내 고문이 결과를 다시 생성하고 다시 확인하도록 요청했을 때 돈을 지불했습니다. 그 후 모든 초안의 부록에 모든 것을 실행하는 스크립트의 소스 코드를 덤핑하도록 전환했습니다. 그러므로 내가 한 일을 알고 있으며 하나의 버튼을 클릭하여 모든 숫자와 그림을 얻을 수 있습니다.
Geoff Oxberry

이 스크립트는 MATLAB 스크립트 일 뿐이므로 지금 설치하지 않습니다. 기능 설명서에는 타사 패키지에 대한 종속성이 나열되어 있습니다. 이러한 써드 파티 패키지는 설치 방법에 대한 명확한 문서를 가지고 있습니다 (다행히도 적극적으로 지원되고 훌륭한 개발자가 있으며 메일 링리스트가 있습니다).
Geoff Oxberry 2016 년

6

Babel과 함께 Emacs의 orgmode가이 를 달성합니다. Babel은 다양한 프로그래밍 및 스크립팅 언어에서 코드 스 니펫을 실행할 수 있습니다. 예를 들어 시뮬레이션 데이터가 포함 된 파일을 열고 orgmode의 테이블에이를 LaTeX (및 기타 여러 형식)로 내보낼 수 있습니다. orgmode의 모든 키 콤보에 익숙해지는 데 꽤 오래 걸리지 만 일단 실행되면 모든 것이 자동입니다.


나는 org-mode를 좋아한다. 나는 개요에 사용합니다. 나는 그것을 바벨과 함께 사용하지 않았다. 나는 그것을 시도해야 할 것이다.
Geoff Oxberry 2016 년

다음은 2012 년 1 월 J. Stat의 훌륭한 개요입니다. 소프트웨어 jstatsoft.org/v46/i03/paper
David LeBauer 2018 년

유럽 ​​물리 저널 A (EPJ A)에서 LaTeX 템플릿을 조직 모드 파일로 변환하는 방법을 보여주는 자습서 를 작성했습니다 .
Melioratus

4

모든 코드를 실행하는 것이 저렴하다면 다음과 같은 첨단 기술을 사용할 수 있습니다.

형식이 지정된 문자열로 문서를 템플릿으로 만들 수 있습니다.

"we observed a %(fractional_improvement)s increase in ..."

다음과 같은 파이썬 스크립트를 작성하십시오

results = {"alpha"                  : run_alpha_computation(...),
           "fractional_improvement" : run_fi_computation(...), 
           ...}

그리고 이렇게하세요

for fn in filenames:
    file = open(fn);      s = file.read();       file.close()
    file = open(fn, 'w'); file.write(s%results); file.close()

그런 다음 이것을 Makefile로 마무리 할 수 ​​있습니다.


내가이 질문을 썼을 때의 나의 첫번째 생각은 당신이 제안한 것과 같은 해결책이었다. 필자는 원래 매크로 전처리기를 사용하는 것과 같은 최첨단 기술을 생각하고 있었지만 Python은 아마도 더 나은 (그리고 더 읽기 쉬운) 접근법 일 것입니다. 빌드 시스템은 결과의 점진적 재생을 처리 할 수 ​​있습니다.
Geoff Oxberry

실제로 이것은 파이썬 서버 페이지와 같은 매우 기본적인 구현입니다. 자동 생성 콘텐츠에 대한 아이디어는 웹 커뮤니티에서 한동안 존재했습니다. 그것이 학계로 이주하는 것을 보는 것이 좋을 것입니다.
MRocklin

동의했다. Jinja2 는 당신이 제안한 것을 수행하는 데 사용될 수 있습니다. 실제로 그것은 dexy가하는 일이지만 구문 강조 및 기타 잡다한 작업을 처리하는 멋진 필터가 많이 있습니다.
Geoff Oxberry

4

LaTeX를 사용하는 경우 상대적으로 최첨단 솔루션은 다음과 같이 전체 줄을 포함하는 코드를 파일에서 추출하거나 스크립트를 사용하여 코드 출력에서 ​​필터링하는 것입니다.

\newcommand{\myresults1}{<value>}

그런 다음 \input명령을 사용하여 해당 파일을 문서에 추가하고 정의 된 명령을 사용하여 값을 배치 할 수 있습니다.


2

Elsevier에서 일합니다. 우리 회사는 저널 이슈에서 실행 가능한 Paper Grand Challenge에 대한 응답으로 개발 된 Collage 프레임 워크를 사용하여 저자가 기사와 함께 실행 가능한 코드를 게시 할 수있게했습니다. 이 기능을 통해 독자는 기사에보고 된 결과를보다 쉽게 ​​재현하고 출판 된 자료를 자신의 연구에 재사용 할 수 있습니다. Collage은 다양한 오픈 소스 및 독점 소프트웨어를 지원합니다. 자세한 내용은 여기 의 정보 비디오 와 Collage Authoring Environment 웹 사이트 에서 확인할 수 있습니다 .


두 번째 링크는 잘못된 것입니다.
David Ketcheson

@Hylke Koers : collage.elsevier.com 링크를 넣어야 합니까?
바울

@Paul : 편집을했습니다. 원래 두 번째 링크는 Collage Google Group에 대한 링크였습니다. 어쩌면 더 나은 링크는 콜라주 자체 일 것입니다. 그러나 나의 초점은 게시물의 좋은 의도를 유지하면서 판촉에 도움이되는 부분을 제거하는 것이 었습니다. 원하는대로 게시물을 자유롭게 편집하십시오.
Geoff Oxberry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.