Làm cách nào để đảm bảo rằng kết quả mô phỏng và kết quả trong bài viết của tôi luôn đồng bộ?


34

Trong một trong những bài báo của tôi, tôi liệt kê một số kết quả bằng số ngoài một số số liệu. Điều tôi muốn làm là đảm bảo rằng các kết quả bằng số trong bài viết của tôi luôn đồng ý với mã. Ngay bây giờ, tôi chỉ sao chép trực tiếp các kết quả số từ đầu ra mô phỏng của mình vào giấy, cực kỳ đơn giản và công nghệ thấp, nhưng dễ bị lỗi, vì tôi có thể sao chép sai kết quả hoặc quên đồng bộ hóa kết quả giấy với mã đầu ra.

Có cách nào tốt để giữ kết quả bằng số mà tôi trích dẫn trong bài viết của mình đồng bộ với kết quả được tạo bởi mã của tôi không? (Ở đây, tôi cho rằng việc thực thi mã là dễ dàng và thiết thực để thực hiện bất cứ khi nào tôi muốn cập nhật bài viết của mình.) Những kết quả bằng số này không nhất thiết phải cho vay dưới dạng bảng. Đôi khi, tôi có các bảng trong bản thảo, nhưng thông thường hơn, tôi có các tham số mô phỏng được liệt kê dưới dạng số trong phương trình . Một ví dụ sẽ là một cái gì đó như:

y*= =(y1*,Giáo dục,yn*)

trong đó tôi muốn thay thế các phần tử của điều kiện ban đầu bằng các tham số thực tế tôi sử dụng trong một mô phỏng tích hợp số lượng một hệ phương trình vi phân thông thường. Sử dụng bảng cho dữ liệu một lần như ví dụ này có vẻ như quá mức cần thiết và nhiều mực hơn mức cần thiết.y*

Tôi cho rằng các số liệu là một trường hợp dễ dàng hơn: bất cứ khi nào tài liệu được "xây dựng" (từ nguồn LaTeX, Markdown, RST, v.v.), hãy bắt đầu quá trình xây dựng bằng cách thực thi mã. Tuy nhiên, nếu mọi người có đề xuất tốt hơn để giữ các số liệu được tạo ra bởi các mô phỏng của tôi đồng bộ với giấy của tôi, tôi rất muốn nghe họ.

Câu trả lời:


14

Như một số ý kiến ​​đã đề xuất, phương pháp này đã được phát triển từ lâu trong cộng đồng R bằng cách xây dựng Sweavevà gần đây hơn , knitr. Rõ ràng cách tiếp cận này có nhược điểm là cụ thể về ngôn ngữ tại thời điểm này, nhưng lợi thế là nó thường được sử dụng trong các bài báo học thuật.

Sử dụng Sweave trong các ấn phẩm thực

  • Các Tạp chí Biostatistics khuyến khích các đệ trình, và đặt một bức thư kitemark "R" trên giấy tờ học tập, trong đó biên tập reproduciblity đã có thể chạy mã và dữ liệu và nhận được những kết quả này.
  • Về cơ bản, tất cả các ấn phẩm trong Tạp chí R được xây dựng trên Sweave.

Tất nhiên, thông thường hơn người dùng Sweave / đanr chỉ gửi đầu ra cuối cùng cho hầu hết các tạp chí, với sự tự tin cá nhân rằng các phương pháp thực sự tái tạo kết quả. Tương tự như vậy, sweave thường được sử dụng để tạo các slide cho các cuộc đàm phán chuyên nghiệp, v.v.

Các tính năng hữu ích

Để có ích trong thực tế, một hệ thống như vậy cần có một số tính năng nhất định. Với một lượng lớn người dùng quan trọng, nhiều trong số này được phát triển tốt knitr. Một vài điểm nổi bật:

  • Bộ nhớ đệm. Viết theo định dạng như markdown hoặc latex phải được biên dịch để xem đầu ra làm cho điều này bao gồm cả mã không thể khi kết quả không thể được lưu vào bộ đệm. Bộ nhớ đệm thông minh knitrthực sự làm cho việc gỡ lỗi mã chuyên sâu dễ dàng hơn nhiều so với làm việc thuần túy R, vì không cần thiết phải chạy lại các đoạn thành công.

  • Chuyển đổi hiển thị mã. Trong một ấn phẩm chính thức, người ta có thể không muốn bất kỳ mã cơ bản nào hiển thị trên đầu ra. Trong khi đó, nó thường có giá trị để hiển thị mã (được định dạng độc đáo, được tô sáng bằng cú pháp) tạo ra kết quả ở định dạng đầu ra khi bạn muốn người đọc thấy chính xác những gì bạn đang gõ.

  • Cộng đồng. Có lẽ ưu điểm hấp dẫn nhất của phương pháp này so với giải pháp homebrewed là số lượng người quen thuộc với mô hình và cố gắng cải thiện nó.

  • Rất nhiều ví dụ hay về các tính năng khác có thể được tìm thấy trên các bản demo của trang web đan , bao gồm các công cụ để "xuất bản nhẹ" hoặc chia sẻ trên web. Nhiều trong số các tính năng này giúp làm cho phương pháp này tương thích hơn với quy trình làm việc chung của một người, thay vì chỉ làm một số việc khi viết bản thảo.

Chú thích lịch sử.

Mặc dù bắt nguồn từ "lập trình biết chữ" của Knuth, như tên gọi của nó, sự nhấn mạnh khá khác biệt, vì lập trình biết chữ tập trung vào việc kết nối mã và tài liệu phần mềm (trong cộng đồng R có vai trò Roxygen, theo dõi nguồn gốc của nó đến một nhánh khác của "cây lập trình biết chữ").

Đi xa hơn

Về nguyên tắc, chúng tôi có thể yêu cầu nhiều hơn từ một tài liệu động, chẳng hạn như khả năng của người đọc thay đổi đầu vào và xem đầu ra mà không phải chỉnh sửa và biên dịch lại toàn bộ tài liệu, ví dụ, bằng cách sử dụng nền tảng trực tuyến tương tác. XDynDocs có thể là một bước theo hướng này.

Các cách tiếp cận khác

  • Có thể muốn để mắt đến dexy.it
  • Theo một cách tiếp cận hơi khác: Ngày càng nhiều mã máy chủ kinh tế liên quan đến các ấn phẩm trên http://www.runmycode.org/ , sẽ chạy lại các phân tích trên đám mây và cho phép các tham số đầu vào tùy chỉnh hoặc dữ liệu đầu vào tùy chỉnh.

Carl, tôi đã theo dõi trang web của bạn được một thời gian và cách tiếp cận của bạn với đan là một trong những nguồn cảm hứng cho câu hỏi của tôi. Tôi cũng đã theo dõi khéo léo một thời gian vì Zed Shaw sử dụng nó để xây dựng nguồn cho cuốn sách của mình Cách học Python theo cách khó khăn (xem phần git repo ). Điều tôi thích về sự khéo léo trái ngược với các cách tiếp cận lập trình biết chữ khác là mã và văn bản được ghép lỏng lẻo, cho phép sử dụng một trình gỡ lỗi một cách lành mạnh.
Geoff Oxberry

Geoff, tuyệt, cảm ơn vì những bình luận! Anna Nelson là một người tin tưởng lớn trong việc tách rời quá. Người dùng R có thể thực hiện việc tách rời trong đan với mã bên ngoài hoặc spin()chức năng mới . Cá nhân tôi nghĩ rằng khiếu nại của Greg Wilson về lập trình biết chữ là khá cũ. Tôi đã có cùng trải nghiệm khủng khiếp mà anh ấy mô tả với noweb, nhưng việc gỡ lỗi phức tạp đó không tồn tại trong các công cụ hiện đại. Đối với CI biết chữ sử dụng doxygen. Đan là nếu bất cứ điều gì dễ dàng gỡ lỗi hơn R nhờ bộ nhớ đệm và xử lý môi trường.
cboettig

20

Những gì bạn đang yêu cầu là thách thức lớn của Elsivier của "Giấy thực thi" . Trong khi nhiều cách tiếp cận đã được thử, không có cách nào hấp dẫn như các tác giả có thể đề xuất. Dưới đây là một vài ví dụ về các kỹ thuật được sử dụng.

Dự án Madagascar có cách tiếp cận của bạn, bên trong kịch bản tạo có các mô phỏng chạy đồng thời tạo ra các số liệu và giấy.

IPython Notebook cung cấp một tài liệu mà người ta có thể thực thi khi bạn đọc và tạo ra các số liệu cho nội dung trái tim của bạn. (Tôi đã thấy các plugin từ, Mathicala và nhiều giải pháp khác được sử dụng theo cùng một cách)

VisTrails sử dụng cách tiếp cận kiến ​​trúc hướng dịch vụ và cung cấp trình quản lý "providence" hoặc "workflow". Về cơ bản, bạn đăng ký móc để mã sau đó thiết kế một luồng công việc hoặc thử nghiệm tái tạo công việc của bạn. Nó đã được sử dụng trên nhiều loại mã, thậm chí cả cụm HPC. Với phương pháp này, bạn sẽ có cách để phát lại các thí nghiệm.

Có hàng tấn các giải pháp loại này, nhưng đó là ba giải pháp mà tôi rất ấn tượng. Đó là một vấn đề khó khăn và tôi tin rằng chúng ta thực sự thậm chí không gần gũi với việc giải quyết. Chúng tôi thậm chí không thể khiến mọi người phát hành mã của họ bằng giấy tờ của họ, làm thế nào chúng tôi có thể mong đợi họ tái tạo kết quả = P


Trong một tĩnh mạch tương tự có sweave , đó không phải là thứ mà tôi sử dụng nhưng là hấp dẫn trong khái niệm.
dmckee

Dự án Madagascar có vẻ như có thể thú vị khi tôi nghe một bài nói chuyện của một trong những tác giả của nó. Tôi đã không thực sự cố gắng sử dụng nó mặc dù.
Ken

@dmckee: Tôi biết những người đã thành công tốt đẹp với sweave và đan . Tôi không thích các phương pháp lập trình biết chữ vì những lý do tương tự mà Greg Wilson đưa ra cho Phần mềm mộc : giấy và mã được ghép quá chặt, điều này khiến cho việc chạy trình gỡ lỗi trên mã trở nên khó khăn (và có thể cản trở việc chứng minh văn bản).
Geoff Oxberry

Tôi sử dụng Sweave cho mục đích này, nó hoạt động rất độc đáo và tương thích với Lyx. Chế độ Org thậm chí còn tốt hơn và hỗ trợ hầu hết các ngôn ngữ phổ biến.
David LeBauer

13

Tôi đã không có nhiều thành công trong việc sử dụng các giải pháp của người khác cho vấn đề này. Tôi thường chỉ muốn một cái gì đó đơn giản phù hợp với tôi và hoàn thành công việc. Để kết thúc này, tôi thường cố gắng viết một tập lệnh python chịu trách nhiệm chạy tất cả các kết quả, phân tích cú pháp đầu ra, cũng như xây dựng các số liệu / bảng.

Tôi viết mã của mình để tạo các tệp dữ liệu chứa kết quả ở một số định dạng văn bản. Bạn có thể tránh chạy lại các kết quả này trong tập lệnh của mình bằng cách kiểm tra đầu tiên về sự tồn tại của tệp đầu ra (ví dụ: bằng python sử dụng os.path.isfile ()). Nếu bạn muốn chạy lại kết quả của mình, chỉ cần xóa các tệp dữ liệu. Nếu các tệp dữ liệu tồn tại, thì tôi chạy trình phân tích cú pháp của các tệp này. Đối với điều này, mô-đun python cho các biểu thức thông thường là rất hữu ích (re).

Sau đó, từ đầu ra được phân tích cú pháp, tôi tạo các số liệu hoặc bảng. Đối với các bảng trong latex, bạn có thể viết mã để tạo bảng thành một tệp riêng (tôi sử dụng phần mở rộng .tbl) và sau đó đưa mã này vào tệp latex của bạn. Chìa khóa cho tôi là sử dụng 1 script python. Nếu tôi có nhiều, thì sau này tôi tự hỏi cái nào là cái gì và cái gì họ làm. Nếu mô tả này quá mơ hồ tôi có thể gửi cho bạn một số ví dụ.


1
Tôi làm điều này cho các số liệu đã. Tuy nhiên, trong các bài báo tôi đang viết, các bảng sẽ là một định dạng không tự nhiên để trình bày dữ liệu. Thông thường, tôi thực sự chỉ muốn đưa điều kiện ban đầu vào ODE (thực sự, một cái gì đó như 4 - 6 số, cách nhau bằng dấu phẩy) hoặc toàn bộ ma trận các số như một phần bên phải của phương trình. Tôi thích ý tưởng của bạn cho các bảng. Đối với những trường hợp tôi đã đề cập, tôi cảm thấy việc định dạng lại chúng dưới dạng bảng sẽ không tự nhiên và tôi muốn đưa dữ liệu vào định dạng tự nhiên hơn.
Geoff Oxberry

Nathan, bạn có phiền đăng ví dụ không? Tôi sử dụng cùng một cách tiếp cận, ngoại trừ việc tôi cam kết các tệp văn bản vào git và sử dụng git để quản lý kết quả. Sau đó tôi có các kịch bản Python để tạo các ô / bảng. Tôi có một kịch bản cho mỗi cốt truyện hoặc bảng.
Ondřej Čertík

Bạn cũng có thể chuyển đầu ra của tập lệnh shell trực tiếp sang latex bằng lệnh \input{|"path-to-script.py"}. Tôi nghĩ rằng bạn nên đặt tất cả các tham số trong một tệp python (hoặc bất kỳ ngôn ngữ nào là yêu thích của bạn) và sử dụng tham số dòng lệnh để truy cập vào nó như thế nào \input{|"path-to-script.py param-name"}. Trong trường hợp này, bạn có thể đưa tệp param vào các tập lệnh khác để chạy mô phỏng. Tuy nhiên, nó làm cho quá trình biên dịch chậm hơn và có một số điểm tiêu cực khác.
Helium


7

Quan trọng hơn, theo tôi, là đảm bảo rằng bạn có thể tìm ra cách tạo lại tất cả các kết quả của bạn từ đầu trong một tháng hoặc một năm (ví dụ, khi các trọng tài yêu cầu bạn thêm hoặc sửa đổi một cái gì đó). Với mục đích đó, những gì tôi làm là bao gồm một tệp văn bản với các hướng dẫn rất chi tiết về cách tái tạo tất cả các kết quả. Sẽ tốt nhất nếu bạn kiểm tra những điều này bằng cách nhờ người khác (như đồng tác giả) thử chúng. Tôi khuyên bạn cũng nên cung cấp các hướng dẫn này (và tất cả mã của bạn) cho các trọng tài và độc giả.

Dưới đây là một ví dụ (thực sự được chuẩn bị bởi đồng tác giả của tôi, Aron Ahmadia).


Tôi đã làm điều đó trước đây (vì sự tỉnh táo của riêng tôi), và may mắn thay, nó đã được đền đáp khi cố vấn của tôi yêu cầu tôi tạo lại và kiểm tra lại kết quả. Kể từ đó, tôi đã chuyển sang sử dụng mã nguồn của tập lệnh chạy mọi thứ vào phần phụ lục của bản nháp để nó ở đó, tôi biết tôi đã làm gì và tôi có thể nhấp vào một nút để lấy tất cả các số và số.
Geoff Oxberry

Tập lệnh không thực hiện bất kỳ cài đặt nào ngay bây giờ, vì đó chỉ là tập lệnh MATLAB. Trong tài liệu chức năng, nó liệt kê các phụ thuộc vào các gói của bên thứ ba. Đến lượt mình, các gói của bên thứ ba đều có tài liệu rõ ràng về cách cài đặt chúng (và rất may, cũng được hỗ trợ tích cực, có nhà phát triển tuyệt vời và danh sách gửi thư tích cực).
Geoff Oxberry

6

Cực khoái của Emacs kết hợp với Babel đạt được điều đó. Babel có thể thực thi các đoạn mã từ các ngôn ngữ lập trình và kịch bản khác nhau, ví dụ: nó có thể mở tệp chứa dữ liệu mô phỏng và đặt nó vào một bảng trong orgmode, có thể được xuất sang LaTeX (và nhiều định dạng khác). Phải mất khá nhiều thời gian để làm quen với tất cả các tổ hợp phím trong orgmode, nhưng một khi nó chạy mọi thứ sẽ tự động.


Tôi thích chế độ org; Tôi sử dụng nó cho phác thảo. Tôi đã không sử dụng nó với Babel. Tôi sẽ phải thử nó.
Geoff Oxberry

Đây là một tổng quan tuyệt vời từ tháng 1 năm 2012 J. Stat. Phần mềm jstatsoft.org/v46/i03/apers
David LeBauer

Tôi đã viết một hướng dẫn cho thấy cách chuyển đổi mẫu LaTeX từ Tạp chí vật lý châu Âu A (EPJ A) thành một tệp chế độ org.
Melioratus

4

Nếu chạy tất cả mã của bạn là rẻ thì bạn có thể làm một cái gì đó công nghệ thấp như sau:

Bạn có thể tạo mẫu tài liệu của mình bằng các chuỗi được định dạng để chúng trông như thế này

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

Có kịch bản python trông như thế này

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

Và sau đó làm một cái gì đó như thế này

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

Sau đó, bạn có thể gói nó trong Makefile.


Suy nghĩ đầu tiên của tôi khi tôi viết câu hỏi này là một giải pháp giống như cách bạn đề xuất. Ban đầu tôi đã nghĩ đến một thứ công nghệ thấp hơn như sử dụng bộ tiền xử lý macro, nhưng Python có lẽ là một cách tiếp cận tốt hơn (và chắc chắn dễ đọc hơn), sau đó một hệ thống xây dựng có thể xử lý việc tái tạo kết quả tăng dần.
Geoff Oxberry

Thực sự đây chỉ là một triển khai rất cơ bản của một cái gì đó như các trang máy chủ python. Ý tưởng về nội dung được tạo tự động đã xuất hiện trong cộng đồng web trong một thời gian. Thật tuyệt khi thấy nó di cư đến học viện.
MRocklin

Đã đồng ý. Jinja2 có thể được sử dụng để làm những gì bạn đề xuất. Trên thực tế, đó là những gì khéo léo làm, nhưng với một loạt các bộ lọc tuyệt vời cũng xử lý tô sáng cú pháp và các tác vụ lặt vặt khác.
Geoff Oxberry

4

Nếu bạn đang sử dụng LaTeX, một giải pháp công nghệ tương đối thấp là để mã của bạn nhổ ra một tệp (hoặc nếu không sử dụng tập lệnh để lọc từ đầu ra mã của bạn) có chứa một loạt các dòng như thế này:

\newcommand{\myresults1}{<value>}

Sau đó, bạn có thể sử dụng \inputlệnh để thêm tệp đó vào tài liệu của mình và sử dụng các lệnh được xác định để đặt các giá trị.


2

Tôi làm việc cho Elsevier. Công ty của tôi đã bắt đầu sử dụng khung Ghép ảnh (được phát triển để đáp ứng với Thử thách lớn trên giấy thực thi) trong các vấn đề tạp chí để cho phép các tác giả xuất bản các đoạn mã thực thi với bài viết của họ. Tính năng này giúp người đọc dễ dàng tái tạo các kết quả được báo cáo trong bài viết và sử dụng lại tài liệu đã xuất bản cho nghiên cứu của riêng họ. Cắt dán hỗ trợ nhiều loại phần mềm nguồn mở và độc quyền; nhiều thông tin hơn có thể được tìm thấy trong video thông tin ở đây và tại Trang web Môi trường Tác giả Cắt dán .


Liên kết thứ hai là điều sai.
David Ketcheson

@Hylke Koers: Ý của bạn là đặt liên kết này: collage.elsevier.com ?
Paul

@Paul: Tôi đã thực hiện các chỉnh sửa; liên kết thứ hai ban đầu là Nhóm Google cắt dán. Có thể một liên kết tốt hơn sẽ là ghép chính nó, nhưng trọng tâm của tôi là cố gắng (chủ yếu) bảo tồn ý định tốt của bài đăng trong khi loại bỏ các phần làm cho nó có vẻ quảng cáo. Hãy chỉnh sửa bài viết khi bạn thấy phù hợp.
Geoff Oxberry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.