ฉันจะแน่ใจได้อย่างไรว่าผลลัพธ์ของการจำลองและผลลัพธ์ในเอกสารของฉันตรงกันเสมอ?


34

ในหนึ่งในเอกสารของฉันฉันแสดงรายการผลลัพธ์ตัวเลขนอกเหนือจากตัวเลขบางอย่าง สิ่งที่ฉันต้องการจะทำคือตรวจสอบให้แน่ใจว่าผลลัพธ์ตัวเลขในเอกสารของฉันเห็นด้วยเสมอกับรหัส ตอนนี้ฉันเพิ่งคัดลอกผลลัพธ์เชิงตัวเลขจากผลลัพธ์การจำลองของฉันลงในกระดาษซึ่งง่ายมากและใช้เทคโนโลยีต่ำ แต่มีข้อผิดพลาดง่ายเพราะฉันสามารถคัดลอกผลลัพธ์ผิดพลาดหรือลืมซิงค์ผลลัพธ์กระดาษด้วย รหัสออก

มีวิธีที่ดีในการเก็บผลลัพธ์ตัวเลขที่ฉันอ้างอิงในเอกสารของฉันให้สอดคล้องกับผลลัพธ์ที่สร้างโดยรหัสของฉันหรือไม่ (ที่นี่ฉันคิดว่าการใช้งานโค้ดนั้นทำได้ง่ายและใช้งานได้จริงทุกครั้งที่ฉันต้องการอัพเดทรายงาน) ผลลัพธ์เชิงตัวเลขเหล่านี้ไม่จำเป็นที่จะต้องยืมตัวไปเป็นแบบตาราง บางครั้งฉันมีตารางในต้นฉบับ แต่มากกว่าปกติผมได้พารามิเตอร์จำลองระบุว่าเป็นตัวเลขในสมการ ตัวอย่างจะเป็นสิ่งที่ชอบ:

y=(y1,,yn)

โดยที่ฉันต้องการแทนที่องค์ประกอบของเงื่อนไขเริ่มต้นด้วยพารามิเตอร์จริงที่ฉันใช้ในการจำลองที่ผสานระบบตัวเลขของสมการเชิงอนุพันธ์สามัญ การใช้ตารางสำหรับข้อมูลที่ใช้ครั้งเดียวเช่นตัวอย่างนี้ดูเหมือนว่ามากเกินไปและหมึกมากกว่าที่จำเป็นy

ฉันคิดว่าตัวเลขเป็นกรณีที่ง่ายกว่า: เมื่อใดก็ตามที่เอกสาร "สร้าง" (จากแหล่ง LaTeX, Markdown, RST ฯลฯ ) ให้เริ่มกระบวนการสร้างโดยการเรียกใช้รหัส อย่างไรก็ตามหากผู้คนมีข้อเสนอแนะที่ดีกว่าสำหรับการรักษาตัวเลขที่สร้างขึ้นโดยแบบจำลองของฉันในการซิงค์กับกระดาษของฉันฉันชอบที่จะได้ยินพวกเขา

คำตอบ:


14

ในฐานะที่เป็นความคิดเห็นบางส่วนได้แนะนำวิธีการนี้ได้รับการพัฒนาในชุมชนการวิจัยโดยการสร้างและเมื่อเร็วSweaveknitrเห็นได้ชัดว่าวิธีการนี้มีข้อเสียของการเป็นภาษาเฉพาะในขณะนี้ แต่ข้อดีที่ใช้เป็นประจำในเอกสารวิชาการ

การใช้ Sweave ในสื่อสิ่งพิมพ์จริง

  • วารสารชีวสถิติกระตุ้นให้เกิดการส่งเหล่านี้และสถานที่จดหมาย kitemark "R" ในเอกสารทางวิชาการที่แก้ไข reproduciblity ได้รับสามารถที่จะเรียกใช้รหัสและข้อมูลและได้รับผลเหล่านี้
  • โดยพื้นฐานแล้วสิ่งพิมพ์ทั้งหมดในR-Journalนั้นสร้างจาก Sweave

แน่นอนว่าโดยทั่วไปผู้ใช้ Sweave / knitr จะส่งผลลัพธ์สุดท้ายไปยังวารสารส่วนใหญ่ด้วยความมั่นใจส่วนตัวว่าวิธีการนี้จะให้ผลลัพธ์ที่แท้จริง Sweave เช่นเดียวกันมักจะใช้ในการสร้างสไลด์สำหรับการพูดคุยอย่างมืออาชีพเป็นต้น

คุณสมบัติที่มีประโยชน์

เพื่อให้มีประโยชน์ในทางปฏิบัติระบบดังกล่าวควรมีคุณสมบัติบางอย่าง ด้วยจำนวนผู้ใช้ที่สำคัญจำนวนมากเหล่านี้ได้รับการพัฒนามาknitrอย่างดี ไฮไลท์บางประการ:

  • แคช การเขียนในรูปแบบเช่นมาร์กดาวน์หรือลาเท็กซ์ที่ต้องรวบรวมเพื่อดูผลลัพธ์ทำให้สิ่งนี้รวมถึงโค้ดที่เป็นไปไม่ได้เมื่อผลลัพธ์ไม่สามารถแคชได้ การแคชอย่างชาญฉลาดknitrทำให้การดีบักโค้ดเข้มข้นง่ายกว่าทำงานอย่างแท้จริงRเนื่องจากไม่จำเป็นต้องเรียกใช้ชิ้นส่วนที่ประสบความสำเร็จอีกครั้ง

  • แสดงรหัสสลับ ในสิ่งพิมพ์ที่เป็นทางการเราอาจไม่ต้องการให้รหัสอ้างอิงใด ๆ ปรากฏบนผลลัพธ์ ในขณะเดียวกันก็มักจะมีประโยชน์ที่จะแสดงรหัส (เน้นรูปแบบทางไวยากรณ์) ที่สร้างผลลัพธ์ในรูปแบบเอาต์พุตเมื่อคุณต้องการให้ผู้อ่านเห็นสิ่งที่คุณกำลังพิมพ์

  • ชุมชน. บางทีข้อได้เปรียบที่น่าสนใจที่สุดของวิธีการนี้กับโซลูชัน homebrewed คือจำนวนคนที่คุ้นเคยกับแบบจำลองและพยายามปรับปรุง

  • ตัวอย่างที่ดีของคุณสมบัติอื่น ๆ สามารถพบได้ในการสาธิตหน้าเว็บ knitrรวมถึงเครื่องมือสำหรับ "การเผยแพร่ที่มีน้ำหนักเบา" หรือการแบ่งปันบนเว็บ คุณสมบัติหลายอย่างเหล่านี้ช่วยให้วิธีการนี้เข้ากันได้กับเวิร์กโฟลว์ทั่วไปของคนมากกว่าสิ่งที่ต้องทำเมื่อเขียนต้นฉบับเท่านั้น

เชิงอรรถประวัติ

ในขณะที่หยั่งรากลึกในนูของ "ความรู้การเขียนโปรแกรม" เป็นชื่อที่แสดงให้เห็นความสำคัญแตกต่างกันมากเช่นการเขียนโปรแกรมความรู้มุ่งเน้นไปที่การเชื่อมต่อรหัสซอฟต์แวร์และเอกสาร (ใน R ชุมชนที่บทบาทเล่นโดยRoxygenซึ่งร่องรอยของรากจะเป็นสาขาที่แตกต่างกันของ "แผนผังการเขียนโปรแกรมเชิงความรู้")

ไปไกลกว่า

ในหลักการเราอาจขอเพิ่มเติมจากเอกสารแบบไดนามิกเช่นความสามารถของผู้อ่านในการเปลี่ยนอินพุตและดูผลลัพธ์โดยไม่ต้องแก้ไขและคอมไพล์เอกสารทั้งหมดตัวอย่างเช่นการใช้แพลตฟอร์มออนไลน์เชิงโต้ตอบ XDynDocsอาจเป็นขั้นตอนในทิศทางนี้

แนวทางอื่น ๆ

  • อาจต้องการจับตาดูdexy.it
  • ในแนวทางที่แตกต่างกันเล็กน้อย: รหัสโฮสต์เอกสารทางเศรษฐศาสตร์จำนวนมากขึ้นที่เกี่ยวข้องกับสิ่งตีพิมพ์บนhttp://www.runmycode.org/ซึ่งจะทำการวิเคราะห์บนคลาวด์อีกครั้งและอนุญาตพารามิเตอร์อินพุตที่กำหนดเองหรือข้อมูลอินพุตที่กำหนดเอง

คาร์ลฉันได้ติดตามเว็บไซต์ของคุณมาระยะหนึ่งแล้วและวิธีการของคุณกับ knitr เป็นแรงบันดาลใจสำหรับคำถามของฉัน ฉันยังได้ติดตาม dexy อยู่พักหนึ่งเพราะ Zed Shaw ใช้เพื่อสร้างแหล่งข้อมูลสำหรับหนังสือของเขาHow To Learn Python the Hard Way (ดูgit repo ) สิ่งที่ฉันชอบเกี่ยวกับ dexy เมื่อเทียบกับวิธีการเขียนโปรแกรมอื่น ๆ รู้ว่าเป็นรหัสและข้อความเป็นคู่กันอย่างหลวม ๆ ช่วยให้การใช้ดีบักอย่างมีสติ
Geoff Oxberry

เจฟฟ์เจ๋งขอบคุณสำหรับความคิดเห็น! แอนนาเนลสันเป็นผู้เชื่อที่สำคัญในการแยกความเชื่อด้วย ผู้ใช้ R สามารถ decoupling ใน knitr ได้สำเร็จด้วยการส่งรหัสภายนอกหรือspin()ฟังก์ชั่นใหม่ โดยส่วนตัวแล้วฉันคิดว่าข้อร้องเรียนของ Greg Wilson เกี่ยวกับการเขียนโปรแกรมเชิงวรรณกรรมนั้นค่อนข้างเก่า ฉันมีประสบการณ์ที่แย่มากที่เขาอธิบายด้วย noweb แต่การแก้จุดบกพร่องที่ซับซ้อนนั้นไม่มีอยู่ในเครื่องมือที่ทันสมัย สำหรับ CI ที่รู้หนังสือให้ใช้ doxygen Knitr คือถ้าการ debug ง่ายกว่า R ขอบคุณการแคชและการจัดการสภาพแวดล้อม
cboettig

20

สิ่งที่คุณจะขอเป็นความท้าทายที่ยิ่งใหญ่ Elsivier ของ"ปฏิบัติการกระดาษ" ในขณะที่มีการพยายามหลายวิธี แต่ก็ไม่มีใครที่น่าสนใจเท่าที่ผู้เขียนอาจแนะนำ นี่คือตัวอย่างของเทคนิคที่ใช้

มาดากัสการ์โครงการใช้แนวทางของคุณในสคริปต์ทำให้มีการจำลองที่ทำงานที่ผลิตตัวเลขและกระดาษพร้อมกัน

IPython Notebookจัดเตรียมเอกสารที่สามารถใช้งานได้เมื่อคุณอ่านและสร้างตัวเลขตามเนื้อหาในใจของคุณ (ฉันเคยเห็นปลั๊กอินคำ Mathematica และโซลูชั่นอื่น ๆ มากมายที่ใช้ในแบบเดียวกัน)

VisTrailsใช้แนวทางสถาปัตยกรรมที่มุ่งเน้นบริการและให้ผู้จัดการ "สุขุม" หรือ "เวิร์กโฟลว์" โดยทั่วไปคุณลงทะเบียน hooks เป็นรหัสจากนั้นออกแบบเวิร์กโฟลว์หรือการทดลองที่สร้างงานของคุณใหม่ มันถูกใช้กับรหัสหลายประเภทแม้กระทั่งกลุ่ม HPC ด้วยวิธีนี้คุณจะมีวิธีในการเล่นซ้ำการทดสอบ

มีโซลูชั่นประเภทเหล่านี้อยู่มากมาย แต่นั่นคือสามสิ่งที่ฉันประทับใจ มันเป็นปัญหาที่ยากและเป็นสิ่งที่ฉันเชื่อว่าเราไม่ได้พูดถึง เราไม่สามารถทำให้คนปล่อยรหัสด้วยเอกสารได้เราจะคาดหวังให้พวกเขาทำซ้ำผลลัพธ์ = P ได้อย่างไร


ในหลอดเลือดดำที่คล้ายกันมีsweaveซึ่งไม่ใช่สิ่งที่ฉันใช้ แต่เป็นที่น่าสนใจในแนวคิด
dmckee

โครงการมาดากัสการ์ดูเหมือนว่าจะน่าสนใจเมื่อฉันฟังการพูดคุยของผู้เขียนคนหนึ่ง ฉันยังไม่ได้ลองใช้ดู
Ken

@dmckee: ฉันรู้ว่าคนที่มีความสำเร็จที่ดีกับ sweave และknitr ฉันเข้าใจวิธีการเขียนโปรแกรมแบบไม่รู้จบด้วยเหตุผลเดียวกับที่Greg Wilson ให้กับ Software Carpentry : กระดาษและรหัสนั้นแน่นเกินไปซึ่งทำให้ยากต่อการเรียกใช้ดีบักเกอร์บนโค้ด (และอาจเป็นวิธีการพิสูจน์อักษร ข้อความ).
Geoff Oxberry

ฉันใช้ Sweave เพื่อจุดประสงค์นี้มันทำงานได้ดีมากและ cOmpatible กับ Lyx โหมด Org นั้นดียิ่งขึ้นและรองรับภาษาที่พบบ่อยที่สุด
ดาวิดเลอบัวเออร์

13

ฉันไม่ได้ประสบความสำเร็จในการใช้วิธีแก้ไขปัญหาของคนอื่นในการแก้ไขปัญหานี้ ฉันมักจะต้องการสิ่งที่เรียบง่ายที่เหมาะกับฉันและทำงานให้เสร็จ ด้วยเหตุนี้ฉันมักจะพยายามเขียนสคริปต์ python หนึ่งตัวซึ่งรับผิดชอบการรันผลลัพธ์ทั้งหมดแยกวิเคราะห์เอาต์พุตรวมถึงสร้างตัวเลข / ตาราง

ฉันเขียนรหัสเพื่อสร้างดาต้าไทล์ซึ่งมีผลลัพธ์ในรูปแบบข้อความบางอย่าง คุณสามารถหลีกเลี่ยงการทำซ้ำผลลัพธ์เหล่านี้ในสคริปต์ของคุณโดยการทดสอบครั้งแรกสำหรับการมีอยู่ของไฟล์ที่ส่งออก (ในหลามใช้ os.path.isfile () ตัวอย่างเช่น) หากคุณต้องการรันผลลัพธ์อีกครั้งเพียงลบ datafiles หาก datafiles มีอยู่ฉันจะเรียกใช้ parser ของไฟล์เหล่านี้ สำหรับสิ่งนี้โมดูลไพ ธ อนสำหรับนิพจน์ทั่วไปมีประโยชน์มาก (อีกครั้ง)

จากผลลัพธ์ที่แยกวิเคราะห์แล้วฉันจะสร้างรูปหรือตาราง สำหรับตารางในลาเท็กซ์คุณสามารถเขียนรหัสเพื่อสร้างตารางเป็นไฟล์แยกต่างหาก (ฉันใช้นามสกุล. tbl) จากนั้นใส่มันเข้าไปในไฟล์ลาเท็กซ์ของคุณ พวกเขาสำคัญสำหรับฉันคือการใช้สคริปต์ 1 หลาม หากฉันมีจำนวนมากฉันก็สงสัยในภายหลังว่าอันไหนเป็นแบบไหนและพวกเขาทำอะไร หากคำอธิบายนี้ไม่ชัดเจนฉันสามารถส่งตัวอย่างให้คุณได้


1
ฉันทำสิ่งนี้เพื่อตัวเลขแล้ว อย่างไรก็ตามในเอกสารที่ฉันเขียนตารางจะเป็นรูปแบบที่ไม่เป็นธรรมชาติซึ่งจะนำเสนอข้อมูล บ่อยครั้งที่ฉันต้องการรวมเงื่อนไขเริ่มต้นให้กับ ODE (เช่นตัวเลข 4-6 คั่นด้วยเครื่องหมายจุลภาค) หรือเมทริกซ์ทั้งจำนวนเป็นส่วนหนึ่งของด้านขวาของสมการ ฉันชอบความคิดของคุณสำหรับตาราง สำหรับกรณีที่ฉันกล่าวถึงฉันรู้สึกว่าการจัดรูปแบบตารางใหม่จะผิดธรรมชาติและฉันต้องการรวมข้อมูลในรูปแบบที่เป็นธรรมชาติมากขึ้น
Geoff Oxberry

นาธานคุณจะสนใจการโพสต์ตัวอย่างหรือไม่ ฉันใช้วิธีการเดียวกันยกเว้นว่าฉันส่งไฟล์ข้อความเป็น git และใช้ git เพื่อจัดการผลลัพธ์ ฉันมีสคริปต์ Python ในการสร้างแปลง / ตาราง ฉันมีหนึ่งสคริปต์ต่อพล็อตหรือตาราง
OndřejČertík

\input{|"path-to-script.py"}คุณยังสามารถท่อส่งออกของเชลล์สคริปต์โดยตรงกับน้ำยางใช้คำสั่ง ฉันคิดว่าคุณควรที่จะใส่พารามิเตอร์ทั้งหมดในหลามเดียว (หรือภาษาใดเป็นที่ชื่นชอบของคุณ) \input{|"path-to-script.py param-name"}ไฟล์และคำสั่งการใช้พารามิเตอร์บรรทัดที่จะเข้าถึงมันเหมือน ในกรณีนี้คุณสามารถรวมไฟล์ param ลงในสคริปต์อื่น ๆ เพื่อเรียกใช้การจำลอง อย่างไรก็ตามมันทำให้การรวบรวมช้าลงและมีจุดลบอื่น ๆ
ฮีเลียม


7

ที่สำคัญยิ่งกว่าคือในความคิดของฉันคือการทำให้แน่ใจว่าคุณสามารถหาวิธีสร้างผลลัพธ์ทั้งหมดของคุณใหม่ตั้งแต่เริ่มต้นในเดือนหรือปี (ตัวอย่างเช่นเมื่อผู้ตัดสินขอให้คุณเพิ่มหรือแก้ไขบางสิ่ง) เพื่อจุดประสงค์นั้นสิ่งที่ฉันทำคือการรวมไฟล์ข้อความที่มีคำแนะนำอย่างละเอียดเกี่ยวกับวิธีการสร้างผลลัพธ์ทั้งหมด เป็นการดีที่สุดถ้าคุณทดสอบสิ่งเหล่านี้โดยให้คนอื่น (เช่นผู้เขียนร่วม) ลองพวกเขา ฉันขอแนะนำให้คุณให้คำแนะนำเหล่านี้ (และรหัสทั้งหมดของคุณ) ให้กับผู้ตัดสินและผู้อ่าน

นี่คือตัวอย่าง (เตรียมโดย Aron Ahmadia ผู้เขียนร่วมของฉัน)


ฉันเคยทำมาก่อน (เพื่อสุขภาพจิตที่ดีของตัวเอง) และขอบคุณที่จ่ายให้เมื่อที่ปรึกษาของฉันขอให้ฉันสร้างและตรวจสอบผลลัพธ์อีกครั้ง ฉันเปลี่ยนมาใช้เพียงแค่ทิ้งซอร์สโค้ดของสคริปต์ที่ทำงานทุกอย่างในภาคผนวกของแบบร่างของฉันดังนั้นจึงมีฉันรู้ว่าฉันทำอะไรและฉันสามารถคลิกปุ่มเดียวเพื่อรับตัวเลขและตัวเลขทั้งหมด
Geoff Oxberry

สคริปต์ไม่ได้ทำการติดตั้งใด ๆ ในตอนนี้เพราะเป็นเพียงสคริปต์ MATLAB ในเอกสารฟังก์ชันจะแสดงรายการการขึ้นต่อกันของแพ็คเกจของบุคคลที่สาม ในทางกลับกันแพ็คเกจของบุคคลที่สามทั้งคู่มีเอกสารที่ชัดเจนเกี่ยวกับวิธีการติดตั้ง (และขอขอบคุณที่ได้รับการสนับสนุนอย่างแข็งขันมีผู้พัฒนาที่ยอดเยี่ยมและรายชื่ออีเมลที่ใช้งานอยู่)
Geoff Oxberry

6

โหมดจุดสุดยอดของ Emacs เมื่อใช้ร่วมกับ Babel ทำให้ได้ผลสำเร็จ Babel สามารถรันโค้ดตัวอย่างจากการเขียนโปรแกรมและภาษาสคริปต์ต่างๆเช่นสามารถเปิดไฟล์ที่มีข้อมูลการจำลองและวางลงในตารางในโหมด orgmode ซึ่งสามารถส่งออกไปยัง LaTeX (และรูปแบบอื่น ๆ อีกมากมาย) มันใช้เวลาสักครู่ในการทำความคุ้นเคยกับคอมโบหลักทั้งหมดใน orgmode แต่เมื่อมันทำงานทุกอย่างจะเป็นไปโดยอัตโนมัติ


ฉันชอบโหมดองค์กร ฉันใช้สำหรับโครงร่าง ฉันไม่ได้ใช้กับ Babel ฉันจะต้องลองดู
Geoff Oxberry

นี่คือภาพรวมที่ยอดเยี่ยมจาก Jan 2012 J. Stat ซอฟต์แวร์jstatsoft.org/v46/i03/paper
David LeBauer

ฉันเขียนบทช่วยสอนที่แสดงวิธีแปลงเทมเพลต LaTeX จาก European Physical Journal A (EPJ A) เป็นไฟล์โหมดองค์กร
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

ฉันทำงานให้เอลส์เวียร์ บริษัท ของฉันเริ่มใช้งานเฟรมเวิร์ก Collage (พัฒนาขึ้นเพื่อตอบสนองต่อความท้าทายของกระดาษที่เรียกใช้งานได้) ในวารสารฉบับนี้เพื่อให้ผู้เขียนสามารถเผยแพร่โค้ดที่สามารถใช้งานได้กับบทความของพวกเขา คุณลักษณะนี้ช่วยให้ผู้อ่านทำซ้ำผลลัพธ์ที่รายงานในบทความได้ง่ายขึ้นและนำเนื้อหาที่เผยแพร่ไปใช้ซ้ำเพื่อการวิจัยของตนเอง Collage รองรับซอฟต์แวร์โอเพนซอร์ซและกรรมสิทธิ์มากมาย ข้อมูลเพิ่มเติมสามารถพบได้ในวิดีโอที่ให้ข้อมูลที่นี่และในCollage การเขียนเว็บไซต์สิ่งแวดล้อม


ลิงค์ที่สองคือสิ่งที่ผิด
David Ketcheson

@Hylke Koers: คุณหมายถึงใส่ลิงค์นี้: collage.elsevier.comหรือเปล่า?
เปาโล

@ พอล: ฉันทำการแก้ไข; ลิงค์ที่สองดั้งเดิมคือ Collage Google Group อาจจะเป็นการเชื่อมโยงที่ดีกว่านั้นก็คือ Collage แต่ฉันให้ความสำคัญกับการพยายามรักษาส่วนใหญ่ของโพสต์เอาไว้ในขณะที่เอาชิ้นส่วนที่ทำให้การโปรโมตออกมาดี รู้สึกอิสระที่จะแก้ไขโพสต์ตามที่เห็นสมควร
Geoff Oxberry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.