시뮬레이션 결과와 논문의 결과가 항상 동기화되도록하려면 어떻게해야합니까? 확인하는 것입니다. 지금은 시뮬레이션 결과의

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

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

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

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

와이

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



답변

일부 의견에서 알 수 있듯이이 접근 방식은 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/의 출판물과 관련된 점점 더 많은 경제 논문 호스트 코드 가 클라우드에서 분석을 다시 실행하고 사용자 정의 입력 매개 변수 또는 사용자 정의 입력 데이터를 허용합니다.

답변

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

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

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

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

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


답변

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

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

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


답변

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

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


답변

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


답변

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

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

"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로 마무리 할 수 ​​있습니다.


답변

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

\newcommand{\myresults1}{<value>}

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