Simülasyonlarımın sonuçlarının ve makalemdeki sonuçların her zaman senkronize olduğundan nasıl emin olabilirim?


34

Makalelerimden birinde bazı rakamlara ek olarak bazı sayısal sonuçları da listeliyorum. Yapmak istediğim, makalemdeki sayısal sonuçların daima kodla aynı olduğundan emin olmak. Şu anda, simülasyon çıktılarımdan elde ettiğim sayısal sonuçları doğrudan son derece basit ve düşük teknolojili, ancak hata eğilimli kağıda kopyalarım, çünkü sonuçları yanlış kopyalayabilir veya kağıt sonuçlarını eşitlemeyi unutabilirim. kod çıkışı.

Makalelerimde alıntı yaptığım sayısal sonuçları kodum tarafından oluşturulan sonuçlarla senkronize etmenin iyi bir yolu var mı? (Burada, kodun çalıştırılmasının, kağıdımı güncellemek istediğimde yapmanın kolay ve pratik olduğunu farz ediyorum.) Bu sayısal sonuçların, kendilerini tablo biçiminde vermeleri gerekmez. Bazen yazılarda tablolarım var ama daha genel olarak denklemlerde sayılar olarak listelenen simülasyon parametrelerim var . Bir örnek şöyle bir şey olurdu:

y=(y1,,yn)

ilk koşul ilk elemanlarını , sıradan diferansiyel denklem sistemlerini sayısal olarak bütünleştiren bir simülasyonda kullandığım gerçek parametrelerle değiştirmek istiyorum. Bu örnek gibi bir kereye mahsus veriler için bir tablo kullanmak gereğinden fazla abartılı ve daha fazla mürekkep gibi görünüyor.y

Rakamların daha kolay bir durum olduğunu tahmin ediyorum: Belge "inşa edildiğinde" (LaTeX kaynağından, Markdown'dan, RST'den vb.), Kodu uygulayarak derleme işlemini başlatır. Ancak, insanlar simülasyonlarımın ürettiği rakamları makalemle senkronize etmek için daha iyi önerilerde bulunursa, onları duymayı çok isterim.

Yanıtlar:


14

Bazı yorumların öne sürdüğü gibi, bu yaklaşım uzun zamandır R topluluğuna dayanarak Sweaveve daha yakın zamanda geliştirilerek geliştirilmiştir knitr. Açıkçası, bu yaklaşım şu anda dile özgü olmanın dezavantajına sahip olmakla birlikte, akademik çalışmalarda düzenli olarak kullanılması avantajına sahiptir.

Sweave'in gerçek yayınlarda kullanımı

  • Biyoistatistik Dergisi , bu gönderileri teşvik ve bağıl standart editörü kod ve veri çalıştırmak ve bu sonuçları elde etmek mümkün olmuştur hangi akademik kağıtlarında bir Kitemark® harfi "R" yerleştirir.
  • Esasen R-Journal'daki bütün yayınlar Sweave üzerine inşa edilmiştir.

Elbette daha yaygın Sweave / knitr kullanıcıları çoğu dergiye sadece son çıktıyı sunmakta ve bu yöntemlerin sonuçları gerçekten ortaya koyduğuna dair kişisel bir güven duymaktadır. Aynı şekilde sweave sık sık profesyonel konuşmalarda vb. Slaytlar oluşturmak için kullanılır.

Faydalı özellikler

Pratikte faydalı olması için, böyle bir sistemin belirli özelliklere sahip olması gerekir. Kritik bir kullanıcı kitlesi ile bunların birçoğu gelişmiş knitr. Birkaç olay:

  • Caching. Çıktıyı görmek için derlenmesi gereken işaretleme veya lateks gibi bir formatta yazmak, sonuçları önbelleğe alınamadığında kod dahil olmak üzere imkansız hale getirir. Akıllıca önbelleğe alma, knitryoğun kodun hata ayıklamasını, saf Rparçalardan daha kolay yapar , çünkü başarılı parçaların yeniden çalıştırılması gerekmez.

  • Geçiş kodu gösterimi. Resmi bir yayında, temel kodlardan hiçbirinin çıktıda görünmesini istemeyebilirsiniz. Bu arada, okuyucunun tam olarak yazdıklarınızı görmesini istediğinizde sonuçları üreten formatta (güzel bir şekilde formatlanmış, sözdizimi ile vurgulanmış) kodun gösterilmesi genellikle değerlidir.

  • Topluluk. Belki de bu yaklaşımın ev sahibi bir çözüm üzerindeki en çarpıcı avantajı, modele aşina olan ve onu geliştirmeye çalışan insan sayısıdır.

  • "Hafif yayıncılık" araçları veya web üzerinde paylaşım araçları da dahil olmak üzere , knitr web sayfası demolarında birçok güzel özellik örneği bulunabilir . Bu özelliklerin birçoğu, yalnızca bu yazıyı yazarken yapacak bir şey yerine, bu yaklaşımın genel iş akışıyla daha uyumlu olmasına yardımcı olur.

Tarihsel dipnot.

Adının da belirttiği gibi Knuth'un “okuryazar programlama” larına dayanmakla birlikte, okuryazar programlamanın yazılım kodunu ve dokümantasyonu (R topluluğunda, rolün oynadığı Roxygen, köklerini farklı bir koluna kadar izleyen) bağlamaya odaklandığından vurgu oldukça farklıdır . "okuryazar programlama ağacı").

Ötesine gitmek

Prensipte, örneğin etkileşimli bir çevrimiçi platform kullanarak, tüm dokümanı düzenlemek ve yeniden derlemek zorunda kalmadan okuyucunun girdileri değiştirme ve çıktıları görme yeteneği gibi dinamik bir belgeden çok daha fazlasını sorabiliriz. XDynDocs bu yönde bir adım olabilir.

Diğer yaklaşımlar


Carl, bir süredir web siteni takip ediyordum ve knitr ile yaklaşımın benim soruma ilham verenlerden biriydi. Zed Shaw, bir süredir dexy'i takip ediyorum çünkü Zed Shaw , Zor Yolu Python'u Öğrenmek adlı kitabının kaynağını oluşturmak için kullanıyor ( git repo'yu inceleyin ). Diğer okuryazar programlama yaklaşımlarının aksine dexy'den hoşlandığım şey, kod ve metnin gevşek bir şekilde birleştirilmesi ve hata ayıklayıcının akılcı bir şekilde kullanılmasını sağlamasıdır.
Geoff Oxberry

Geoff, harika, yorumlarınız için teşekkürler! Anna Nelson da ayrılma konusunda büyük bir inanan. R kullanıcıları knitr'deki dekuplajı kod harici hale getirme veya yeni spin()işlevle başarabilirler . Şahsen ben Greg Wilson'un okuryazarlık programına yönelik şikayetlerinin oldukça eski olduğunu düşünüyorum. Noweb ile anlattığı korkunç deneyimi yaşadım, ancak bu sarsıcı hata ayıklama sadece modern araçlarda mevcut değil. Okuryazar CI için doxygen kullanın. Önbellekleme ve çevre kullanımı sayesinde Knitr, R'den daha kolay hata ayıklamak için kullanılır.
cboettig

20

İstediğiniz şey "Çalıştırılabilir Belge" nin Elsivier büyük mücadelesi . Birçok yaklaşım denenmiş olsa da, hiçbiri yazarın önerebileceği kadar çekici değildir. İşte kullanılan tekniklerden birkaç örnek.

Madagaskar Projesi yaklaşımınızı benimsiyor, yapım senaryosunun içinde figürleri ve kağıdı aynı anda üreten simülasyonlar çalışıyor.

IPython Notebook , okuduğunuzda ve kalplerinizin içeriğine göre rakamlar ürettiğinizde çalışabileceğiniz bir belge sunar. (Eklentiler, Mathematica ve aynı şekilde kullanılan birçok başka çözüm gördüm)

VisTrails , hizmet odaklı bir mimari yaklaşım kullanır ve bir " tedarik " veya "iş akışı" yöneticisi sağlar. Temel olarak, kodları kaydetmek için kancaları kaydedersiniz, ardından bir iş akışı tasarlar veya işinizi yeniden üreten bir deney yaparsınız. HPC kümeleri dahil olmak üzere birçok kod türünde kullanılmıştır. Bu yaklaşımla denemeleri tekrar etmenin bir yolu olacaktır.

Dışarıda bu tip çözümlerin tonları var, ancak bunlardan etkilendiğim üç tane var. Bu zor bir problem ve ben gerçekten ele almaya bile yakın olmadığımıza inanıyorum. İnsanların kodlarını bildirileriyle yayınlamalarını bile sağlayamıyoruz, sonuçları tekrarlamalarını nasıl bekleyebiliriz?


Benzer şekilde orada sweave kullandığım o şey değil ancak konsept ilgisini çekmekte olan.
dmckee

Madagaskar Projesi yazarlarından birinin konuşmasını dinlediğimde ilginç olabilirdi. Aslında onu kullanmayı denemedim.
Ken

@dmckee: Ben sweave ve knitr ile iyi başarıya sahip insanlar biliyorum . Greg Wilson’ın Yazılım Marangozluğu’na vermiş olduğu nedenlerle aynı okuryazarlık programlarına yaklaşıyorum : Kağıt ve kod çok sıkı bir şekilde birbirine bağlı, bu da kod üzerinde bir hata ayıklayıcı çalıştırılmasını zorlaştırıyor (ve prova yoluna girebilir) Metin).
Geoff Oxberry

Sweave'ı bu amaçla kullanıyorum, çok iyi çalışıyor ve Lyx ile uyumlu. Org modu daha da iyidir ve en yaygın dilleri destekler.
David LeBauer

13

Bu problem için başkalarının çözümlerini kullanma konusunda çok başarılı olamadım. Genelde sadece benim için çalışan ve işi halleden basit bir şey istiyorum. Bu amaçla, genellikle tüm sonuçları çalıştırma, çıktının ayrıştırma ve şekil / tabloları oluşturmanın sorumlusu olan bir python betiği yazmaya çalışıyorum.

Bazı metin biçiminde sonuçları içeren veri dosyaları oluşturmak için kodlarımı yazıyorum. Öncelikle çıktı dosyasının varlığını test ederek bu sonuçları betiğinizde tekrarlamaktan kaçınabilirsiniz (örneğin, python'da os.path.isfile ()). Sonuçlarınızı tekrar görüntülemek istiyorsanız, sadece veri dosyalarını kaldırın. Veri dosyaları varsa, o zaman bu dosyaların ayrıştırıcısını çalıştırırım. Bunun için düzenli ifadeler için python modülü çok kullanışlıdır (yeniden).

Sonra ayrıştırılan çıktıdan şekil veya tabloları oluşturdum. Lateks içindeki tablolar için, tabloyu ayrı bir dosyaya oluşturacak kodu yazabilir (.tbl uzantısı kullanırım) ve sonra bunu lateks dosyanıza dahil edebilirsiniz. Benim için anahtar 1 python betiği kullanmak. Eğer bir sürü varsa, o zaman hangisinin hangisi olduğunu ve ne yaptıklarını merak ediyorum. Bu açıklama çok belirsiz ise, size bazı örnekler gönderebilirim.


1
Bu tür şeyleri zaten rakamlar için yapıyorum. Ancak, yazdığım makalelerde, tablolar verilerin sunulduğu doğal olmayan bir format olacaktır. Çoğu zaman, sadece başlangıç ​​koşulunu bir ODE'ye (yani gerçekten, 4-6 sayıları, virgüllerle ayrılmış bir şey) veya bir denklemin sağ tarafının bir parçası olarak tam sayı matrisini dahil etmek istiyorum. Masa fikrini sevdim. Bahsettiğim bu durumlar için, onları tablo olarak biçimlendirmenin doğal olmadığını düşünüyorum ve verileri daha doğal bir biçimde eklemek istiyorum.
Geoff Oxberry

Nathan, örnekler gönderir misin? Metin dosyalarını git'e dahil ettiğim hariç, aynı yaklaşımı kullanıyorum ve sonuçları yönetmek için git'i kullanıyorum. Daha sonra grafikler / tablolar üretmek için Python scriptlerine sahibim. Arsa veya masa başına bir senaryom var.
Ondřej Čertík

Komutu kullanarak bir kabuk betiğinin çıktısını doğrudan latekse iletebilirsiniz \input{|"path-to-script.py"}. Tüm parametreleri tek bir python (veya en sevdiğiniz dil) dosyaya koymak ve buna erişmek için komut satırı parametresini kullanmak daha iyi olur \input{|"path-to-script.py param-name"}. Bu durumda benzetimleri çalıştırmak için param dosyasını diğer komut dosyalarına dahil edebilirsiniz. Ancak, derlemeyi yavaşlatır ve başka olumsuz noktaları da vardır.
Helyum


7

Daha da önemlisi, benim görüşüme göre, tüm sonuçlarınızı sıfırdan veya bir ay içinde sıfırdan nasıl yeniden oluşturacağınıza karar verebileceğinizden emin olmak (örneğin, hakemler bir şey eklemenizi veya değiştirmenizi istediğinde). Bu amaçla, yaptığım tüm sonuçların nasıl yeniden üretileceğine ilişkin ayrıntılı talimatlar içeren bir metin dosyası içermektir. Bunları bir başkası (bir yazar gibi) deneyerek denemeniz en iyisidir. Ayrıca, bu talimatları (ve tüm kodunuzu) hakemlere ve okuyuculara da sağlamanızı öneririm.

İşte bir örnek (aslında ortak yazarım Aron Ahmadia tarafından hazırlanmıştır).


Bunu daha önce yaptım (kendi aklım için) ve neyse ki, danışmanım benden sonuçları yeniden oluşturmamı ve tekrar kontrol etmemi istedi. O zamandan beri her şeyi taslaklarımın bir ekinde çalıştıran bir betiğin kaynak kodunu atmaya başladım, o yüzden orada, ne yaptığımı biliyorum ve tüm sayıları ve rakamları almak için bir düğmeyi tıklayabilirim.
Geoff Oxberry

Komut şu anda herhangi bir kurulum yapmıyor, çünkü sadece bir MATLAB betiği. İşlev belgelerinde, üçüncü taraf paketlerine bağımlılıkları listeler. Bu üçüncü taraf paketlerinin de, her ikisinin de nasıl kurulacağına dair açık belgeleri vardır (ve neyse ki, ayrıca aktif olarak desteklenir, harika geliştiricilere ve etkin posta listelerine sahiptir).
Geoff Oxberry

6

Emacs en orgmode Babil ile birlikte o başarır. Babel çeşitli programlama ve kodlama dillerinden kod snippet'lerini çalıştırabilir; örneğin, simülasyon verilerini içeren dosyayı açıp orgmode'da LaTeX'e (ve diğer birçok biçime) dışa aktarılabilen bir tabloya koyabilir. Orgmode'daki tüm tuş kombinasyonlarına alışmak biraz zaman alıyor, fakat bir kez her şey otomatik çalışıyor.


Org modunu severim; Anahatlar için kullanıyorum. Babel ile hiç kullanmadım. Denemek zorundayım.
Geoff Oxberry

İşte Ocak 2012 J. Stat. Yazılım jstatsoft.org/v46/i03/paper
David LeBauer

LaTeX şablonunun European Physical Journal A'dan (EPJ A) bir org modu dosyaya nasıl dönüştürüleceğini gösteren bir ders yazdım .
Melioratus

4

Tüm kodunuzu çalıştırmak ucuzsa, aşağıdaki gibi düşük teknolojili bir şey yapabilirsiniz:

Belgelerinizi, biçimlendirilmiş dizelerle, bu şekilde görünecek şekilde şablonlayabilirsiniz.

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

Buna benzeyen python komut dosyaları var

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

Ve sonra böyle bir şey yapın

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

Daha sonra bunu bir Makefile'a sarabilirsiniz.


Bu soruyu yazarken ilk düşüncem, önerdiğin gibi bir çözüm oldu. Aslında bir makroişlemci kullanmak gibi düşük teknolojili bir şey düşünüyordum, ancak Python muhtemelen daha iyi (ve kesinlikle daha okunaklı) bir yaklaşımdı, o zaman bir derleme sistemi sonuçların artımsal olarak yenilenmesini kaldırabilir.
Geoff Oxberry

Gerçekten bu sadece python sunucusu sayfaları gibi bir şeyin basit bir uygulamasıdır. Otomatik oluşturulan içerik fikri bir süredir web topluluğundadır. Akademi'ye geçtiğini görmek güzel olurdu.
MRocklin

Kabul. Jinja2 önerdiğiniz şeyi yapmak için kullanılabilir. Aslında, bu ne dexy yapar, ancak sözdizimi vurgulama ve diğer çeşitli görevleri de işleyen bir sürü serin filtre ile.
Geoff Oxberry,

4

LaTeX kullanıyorsanız, nispeten düşük teknolojili bir çözüm, kodunuzun bir dosya (veya kodunuzun çıktısını filtrelemek için başka bir komut dosyası) tükürmesini sağlamaktır.

\newcommand{\myresults1}{<value>}

Ardından \inputbu dosyayı belgenize eklemek için komutu kullanabilir ve değerleri yerleştirmek için tanımlanan komutları kullanabilirsiniz.


2

Elsevier için çalışıyorum. Şirketim, yazarların makaleleriyle çalıştırılabilir kod parçalarını yayınlamalarını sağlamak için, dergi sayılarında Collage uygulamasını (Yürütülebilir Paper Grand Challenge'ye göre geliştirilen) kullanmaya başladı. Bu özellik, okuyucuların makalede bildirilen sonuçları yeniden üretmelerini ve yayınlanan materyalleri kendi araştırmaları için yeniden kullanmalarını kolaylaştırır. Collage, çok çeşitli açık kaynaklı ve özel yazılımları destekler; Daha fazla bilgi bilgilendirme videoda bulunabilir burada ve en Kolaj Yazma Çevre Sitesi .


İkinci bağlantı yanlış olanı.
David Ketcheson,

@Hylke Koers: Bu linki koymak istediniz mi : collage.elsevier.com ?
Paul

@Paul: Düzenlemeleri yaptım; orjinal ikinci link ise Collage Google Grubu’dur. Belki de daha iyi bir bağlantı Kolajın kendisi olacaktır, ancak benim odak noktam, sesin tanıtımını yapan parçaları çıkarırken yazının iyi niyetlerini (çoğunlukla) korumaya çalışmaktı. Gördüğünüz gibi yazıyı düzenlemek için çekinmeyin.
Geoff Oxberry,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.