เชื่อมโยง R กับ Julia?


138

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

ดังนั้น:

  • มีสิ่งอำนวยความสะดวกอะไรบ้างสำหรับการเชื่อมโยง R และ Julia
  • พวกเขาแข็งแกร่งและมีความคิดดีเพียงใดในระดับศูนย์ถึง Rcpp?

ฉันต้องการโทรหา Julia จาก R เช่นเดียวกับที่ Rcpp อนุญาตให้เรียก C ++ จากภายใน R ในตอนนี้ ฉันไม่ต้องการเรียก R จาก Julia (ดังนั้น RCall.jl จะไม่ทำงาน)


7
ฉันเดาว่าคุณเป็นผู้ใช้งานเร็วมากและต้องถูกลงโทษเหล่านั้น ฉันยินดีที่จะทำผิด - ฉันยินดีที่จะให้คุณทำงานและปูทางให้พวกเราเป็นผู้ใช้สื่อกลาง ...
Ben Bolker

15
ฟังก์ชั่นที่พวกเขาใช้ในการวัดประสิทธิภาพดูเหมือนเป็นวิธีที่ผิดปกติสวยที่จะใช้ R: github.com/JuliaLang/julia/blob/master/test/perf/perf.R เกือบจะเหมือนกับการใส่ดีเซลลงใน Ferarri ...
James

2
คำถามเป็นเรื่องที่เกี่ยวข้อง AC ABI สำหรับ Julia ดูเหมือนจะเกิดขึ้นใหม่ มีโอกาสที่ฉันจะแทงในการสร้างอินเทอร์เฟซ Julia-to-R เร็ว ๆ นี้
lgautier

4
ฉันมีสะพาน Julia-to-R ที่ใช้งานได้โดยประมาณ ( github.com/lgautier/Rif.jl ) ในทางกลับกันขึ้นอยู่กับงานที่ยังคงดำเนินการอยู่ในตอนท้ายของ Julia
lgautier

3
@lgautier ฉันหวังเป็นอย่างยิ่งว่าคุณจะสามารถกลับมาทำงานต่อได้ นรกถ้ามีหน้า kickstarter เพื่อสนับสนุนสิ่งนี้ฉันจะไปที่นั่นแน่นอน
Maxim.K

คำตอบ:


43

RJulia แพคเกจ R ลักษณะค่อนข้างดีในขณะนี้จากอาร์ R CMD checkทำงานโดยไม่มีคำเตือนหรือข้อผิดพลาด (ถ้าjuliaมีการติดตั้งอย่างถูกต้อง)

สิ่งที่ต้องทำที่ใหญ่ที่สุดในมุมมองของฉันคือการให้ Julia ส่งคืนรายการที่มีชื่อซึ่งเป็นโครงสร้างข้อมูลทั่วไปที่ยืดหยุ่นขั้นพื้นฐานใน R

โปรดทราบว่า Doug Bates แจ้งเตือนฉันเกี่ยวกับ RCallอินเทอร์เฟซแบบสองทิศทางจาก Julia ถึง R (กล่าวคือทิศทางอื่นที่ไม่ใช่ R ถึง Julia) นอกจากนี้ Doug แนะนำให้กำหนดเป้าหมายเป็น julia 0.4.0 แทนที่จะเป็น julia เวอร์ชันเสถียรในปัจจุบัน


1
คำตอบที่ได้รับการยอมรับนั้นล้าสมัยในขณะนี้ วิธีที่ดีที่สุดในการโทรหา Julia จาก R คือ JuliaCall (ดูคำตอบของ Consistency ด้านล่าง) ซึ่ง btw ขึ้นอยู่กับ RCall.jl (แพ็คเกจ Julia เพื่อโทรหา R จาก Julia)
Levasco

1
ขอบคุณ @Levasco. คุณมีสิทธิ์ "ณ ตอนนี้" ฉันรับทราบว่าสิ่งต่างๆกำลังเปลี่ยนแปลงและสิ่งที่ "เหมาะสมที่สุด" เมื่อ 5.2 ปีที่แล้วไม่ได้อยู่ในปัจจุบันอีกต่อไป
Martin Mächler

59

ฉันก็จะได้รับการมองหาที่จูเลียนับตั้งแต่ดั๊กเบตส์ส่งฉันหัวขึ้นในเดือนมกราคม แต่เช่นเดียวกับ @ gsk3 ฉันวัดสิ่งนี้ใน "มาตราส่วน Rcpp" เพราะฉันต้องการส่งผ่านวัตถุ R ที่สมบูรณ์ไปยัง Julia และดูเหมือนจะไม่รองรับเลยในตอนนี้

Julia มีอินเทอร์เฟซ C ที่ดีและเรียบง่าย .C()เพื่อให้เราได้รับสิ่งที่ต้องการ แต่ตามที่พูดถึง r-devel เมื่อเร็ว ๆ นี้คุณไม่ต้องการจริงๆ.C()ในกรณีส่วนใหญ่คุณต้องการที่.Call()จะส่งผ่านตัวแปร SEXP จริงที่แสดงถึงวัตถุ R จริง ตอนนี้ฉันเห็นขอบเขตเพียงเล็กน้อยสำหรับ Julia จาก R เนื่องจากข้อ จำกัด นี้

บางทีอินเทอร์เฟซทางอ้อมโดยใช้ tcp / ip ถึง Rserve อาจเป็นการเริ่มต้นครั้งแรกก่อนที่ Julia จะโตขึ้นเล็กน้อยและเราได้รับอินเทอร์เฟซ C ++ ที่เหมาะสม หรือเราใช้บางอย่างตาม Rcpp เพื่อรับจาก R ถึง C ++ ก่อนที่เราจะเข้าสู่เลเยอร์กลาง [ซึ่งใครบางคนจะต้องเขียน] จากที่เราป้อนข้อมูลไปยัง Julia เช่นเดียวกับ R API ที่แท้จริงจะเสนอเฉพาะเลเยอร์ C Dunno.

และในตอนท้ายของวันอาจจำเป็นต้องมีความอดทน ฉันเริ่มดู R ประมาณปี 1996 หรือ 1997 เมื่อ Fritz Leisch ประกาศครั้งแรกในกลุ่มข่าว comp.os.linux.announce และ R ก็มีสิ่งอำนวยความสะดวกที่ค่อนข้าง จำกัด (แต่แน่นอนว่าภาษา S เรารู้ว่าเรามีผู้ชนะ) และไม่กี่ปีต่อมาฉันก็พร้อมที่จะทำให้เป็นภาษาต้นแบบของฉัน ตอนนั้น CRAN ยังมีไม่ถึง 100 แพ็คเกจ ...

จูเลียอาจไปที่นั่นได้ แต่ตอนนี้ฉันสงสัยว่าพวกเราหลายคนจะทำงานใน R และมีเพียงไม่กี่ภาพที่น่าสงสัยที่ Julia


1
เนื่องจากความรู้ของฉันไม่มีแผนที่จะให้ julia มีคอมไพเลอร์แบบคงที่เพื่อให้การฝังใน C ++ เราอาจต้องรอสักครู่
pyCthon

48

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


4
ฟังดูมีแนวโน้มมาก ฉัน (และฉันคิดว่าคนอื่น ๆ ) มองว่า Julia เป็นสิ่งทดแทนที่ดีสำหรับวิธีการใช้ Matlab ในปัจจุบัน - สำหรับผลลัพธ์ที่ต้องใช้การคำนวณที่หนักหน่วงซึ่งยังคงต้องใช้สัญชาตญาณทางคณิตศาสตร์มากกว่า C และ ilk ที่มีให้ ด้วยเหตุนี้ R และ Julia จึงเป็นส่วนเสริมที่น่าทึ่ง แม้ว่า Julia จะเข้ามาแทนที่ R (และฉันก็สบายดีสำหรับสิ่งนั้น) แต่อย่างน้อยก็ต้องใช้เวลาอย่างน้อยหนึ่งทศวรรษก่อนที่ห้องสมุดสถิติใน Julia จะอยู่ใกล้กับที่อุดมสมบูรณ์ดังนั้นในระหว่างนี้การเชื่อมต่อความสามารถระหว่าง R และ Julia จะช่วยเปิด - แหล่งที่มาของการประมวลผลทางสถิติเจริญเติบโต
Ari B. Friedman

8
สถานการณ์นี้เปลี่ยนไปไหมตั้งแต่คุณเขียนสิ่งนี้ (ps ฉันรักจูเลียขอบคุณสำหรับการทำงานของคุณ!)
Andy Hayden

23

การปรับปรุงอย่างรวดเร็ว เนื่องจากคำถามนี้ถูกถามจึงมีจุดเริ่มต้นของแพ็คเกจ Julia ที่อนุญาตให้เรียกโปรแกรม R จากภายใน Julia

เพิ่มเติมที่นี่: https://github.com/lgautier/Rif.jl


1
ขอบคุณ แต่ดูความคิดเห็นจาก lgautier ด้านบน นี่คือทิศทางตรงกันข้าม ฉันต้องการโทรหา Julia จากภายใน R.
Ari B. Friedman

5
+1 เพราะในหัวข้อแคบ ๆ เช่น Julia ข้อมูลทุกอย่างค่อนข้างให้ข้อมูล
Qbik

อย่างที่ @ AriB Friedman กล่าวว่านี่ไม่ใช่ข้อมูลใหม่ - และเราทุกคนต้องการโทรหา Julia จาก R ไม่ใช่วิธีอื่น
Martin Mächler

14

ฉันสร้างแพ็คเกจ R ที่เรียกว่าJuliaCallเมื่อเร็ว ๆ นี้ซึ่งฝัง Julia ไว้ใน R แพ็คเกจอยู่บน CRAN

https://cran.r-project.org/web/packages/JuliaCall/index.html

https://github.com/Non-Contradiction/JuliaCall

การใช้งานแพ็กเกจเป็นดังนี้:

library(JuliaCall)
julia <- julia_setup()
julia_command("a = sqrt(2)"); julia_eval("a")
julia_eval("sqrt(2)")
julia_call("sqrt", 2)
julia_eval("sqrt")(2)

อย่างที่คุณเห็นคุณสามารถส่งสตริงคำสั่งและเรียกใช้ฟังก์ชัน Julia ได้อย่างง่ายดาย

และยังมีแพ็คเกจ R บางตัวที่ห่อแพ็คเกจ Julia โดยใช้JuliaCallตัวอย่างเช่น

  • convexjlr สำหรับการเขียนโปรแกรม Disciplined Convex ใน R โดยใช้ Convex.jl ซึ่งอยู่ใน CRAN ด้วย
  • ipoptjlrเป็น R Interface สำหรับมหาดไทยจุด Optimizer (IPOPT) Ipopt.jlโดยใช้แพคเกจจูเลีย

ยินดีรับข้อเสนอแนะเกี่ยวกับJuliaCall!!


คุณช่วยฉันได้ไหม - ฉันจะออกจาก Julia โดยใช้JuliaCallอย่างไร ฉันรันโค้ดบน R และในส่วนหนึ่งของไปป์ไลน์ฉันคำนวณ Mixed Models บน Julia (โดยใช้JuliaCall) ดังนั้นฉันต้องการฆ่ากระบวนการจูเลียหลังจากเสร็จสิ้นการดำเนินการแบบจำลองผสม เป็นไปได้ไหม? ฉันพยายามjulia_command("exit()")แต่มันฆ่าเซสชั่น R ด้วย :(
red_quark

@red_quark ไม่จำเป็นต้องฆ่ากระบวนการจูเลียโดยทั่วไป มีเหตุผลเฉพาะหรือไม่? ในกรณีนี้คุณอาจโพสต์คำถามอื่นใน stackoverflow หรือ github
สม่ำเสมอ

สิ่งนี้จำเป็นสำหรับการปล่อย RAM (ที่จัดสรรสำหรับกระบวนการ Julia) ไปยัง OS ฉันมีคำถามดังกล่าวแล้วใน stackoverflow: stackoverflow.com/questions/61000913/…
red_quark

@red_quark สำหรับการปลดปล่อยหน่วยความจำคุณสามารถปล่อยหน่วยความจำในจูเลียแทนที่จะปิดจูเลีย ตัวอย่างเช่นให้ความสนใจกับตัวแปรส่วนกลางและใช้ฟังก์ชันให้มากที่สุด ฉันเพิ่งตอบคำถามที่คล้ายกันใน GitHub อาจเป็นประโยชน์สำหรับคุณ < github.com/Non-Contradiction/JuliaCall/issues/139 >
สม่ำเสมอ

13

มีใครเห็นโครงการนี้

https://github.com/armgong/RJulia

ค่อนข้างใหม่ แต่ดูเหมือนว่าจะทำตามที่ขอ!


4
ขอบคุณสำหรับคำใบ้ แน่นอนว่านี่จะเป็นทางออกหากได้ผล ฉันลองติดตั้ง (โดยใช้ R 3.1.2 ที่แพตช์ปัจจุบัน) และจูเลีย (0.4.0-dev .. อัปเดตเมื่อวันที่ 30 ธันวาคม 2014 เป็นแพ็คเกจ ubuntu) จากนั้นการรวบรวมล้มเหลวและฉันเปิดปัญหา github github.com/armgong/RJulia/issues/10 หวังว่าเราจะดำเนินต่อไป ... เร็ว ๆ นี้
Martin Mächler

1
มีความคืบหน้าไหม ฉันได้รับการแจ้งเตือนการพัฒนาที่ใช้งานได้ดีจากที่เก็บ github ของพวกเขาดังนั้นฉันจึงคิดว่าปัญหากำลังถูกรีดออก ...
อดัม

2
แน่นอน! ไม่ได้ติดตามที่นี่ - แต่ในหน้าปัญหาด้านบน: ปัญหาสำคัญถูกลบออกทั้งหมด ฉันอาสาที่จะทำให้แพคเกจใกล้เคียงกับการส่งต่อ (ไปยัง CRAN) มากขึ้นกล่าวคือโดยการเพิ่มหน้าความช่วยเหลือที่มีประโยชน์ แต่น่าเสียดายที่ฉันลึกเกินไปในเรื่องที่วุ่นวายอื่น ๆ ดังนั้นตอนนี้ต้องรอ (สำหรับฉัน) ก่อน
Martin Mächler

7

นอกจากนี้ยังมีแพ็คเกจ XRJuliaจากแพ็คเกจตระกูลXR ที่มุ่งเป้าไปที่ e X tend Rโดย John Chambers (หนึ่งในผู้สร้าง R) ใช้วิธีการที่แตกต่างกันเล็กน้อย (JSON) ในการถ่ายโอนข้อมูลระหว่าง Julia และ R จากนั้น rJulia และแพ็คเกจที่คล้ายกัน


5

คุณอาจต้องการตรวจสอบความพยายามของฉัน: JuliaConnectoRแพ็คเกจ R แพ็คเกจนี้มีให้จากGitHubและCRAN CRAN

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

คล้ายกับ XRJulia JuliaConnectoR อาศัย TCP แต่เน้นการใช้งานและใช้รูปแบบการสตรีมแบบกำหนดเองที่ได้รับการปรับให้เหมาะสมแทนข้อความ JSON แบบข้อความเหมือนที่ XRJulia ทำ ข้อดีอย่างหนึ่งของการสื่อสารโดย TCP คือความเสถียรเมื่อเทียบกับ Julia และ R เวอร์ชันต่างๆสิ่งนี้ยากกว่ามากในการบำรุงรักษาด้วยการผสานรวมที่อินเตอร์เฟสระดับ C เช่น RCall และ JuliaCall

แพคเกจทำงานร่วมกับ Julia ≥ 1.0 และ R เวอร์ชันที่หลากหลาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.