2016-10-27 7 views
6

क्या मोनो में यूनिटी के सी # का उपयोग करके आर स्क्रिप्ट चलाने का कोई तरीका है?क्या मोनो में यूनिटी सी # या ओएसएक्स पर .NET से आर कोड चलाने के लिए संभव है?

अगर वहाँ मोनो का उपयोग कर एक अनुसंधान स्क्रिप्ट चलाने के लिए कोई रास्ता नहीं है, मैं नेट का उपयोग करने के

अद्यतन

तो निम्न कोड आर स्क्रिप्ट कॉल करेंगे तैयार हूँ, लेकिन एक फ़ाइल उत्पादन नहीं होगा अगर एकता monodevelop से बुलाया जाता है। एक स्ट्रिंग को मोनो पर वापस करना ठीक होगा, लेकिन startInfo.UseShellExecute पर true और false को बदलना ठीक है और startInfo.RedirectStandardOutput एक त्रुटि फेंकता है।

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "Rscript"; 
startInfo.WorkingDirectory = Application.dataPath + "/myUnity/Scripts/"; 
startInfo.Arguments = "Rexp1.R"; 
startInfo.CreateNoWindow = true; 
startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
startInfo.UseShellExecute = true; 
startInfo.RedirectStandardOutput = false; 
process.StartInfo = startInfo; 
process.Start(); 

मुझे यकीन है कि आर स्क्रिप्ट उत्पादन एक फ़ाइल या मैं stdout पकड़ें और उसे पर पकड़ कर सकते हैं के लिए पता है: यहाँ सी # कोड है कि आर कोड फोन होगा। मैं एक फ़ाइल में आउटपुट करने से खुश हूं या एक स्ट्रिंग को वापस करने के लिए एक स्ट्रिंग की अनुमति देता है जो आर स्क्रिप्ट का आउटपुट है।

अपडेट 2 * - यहां आर स्क्रिप्ट है।

sink("output.txt") 
nts <- matrix(rnorm(100), nrow = 500) 
ds <- dist(nts,method = "euclidean", diag = TRUE, upper=TRUE) 
dm <- as.matrix(ds) # distance matrix 
print(dm) 
sink() 
+0

मुझे पता है कि r.Net एक रूपरेखा एकता – CodeGuyRoss

+0

लिए बहुत अधिक है कि क्यों तुम भी यह करने के लिए कोशिश कर रहे हैं का उपयोग करता है? एक प्लगइन के लिए या आप बस आर के साथ अपना खेल बनाना चाहते हैं? – Programmer

+1

मैं आर आर में निर्मित कुछ कार्यों का उपयोग करना चाहता हूं, यह एक बहुत ही शक्तिशाली वैज्ञानिक शोध भाषा है और इसका उपयोग कई परिचालनों को कम करने के लिए किया जा सकता है। मुझे लगता है कि आप इसे एक गेम के लिए इस्तेमाल कर सकते हैं लेकिन मैं शोध कर रहा हूं। – CodeGuyRoss

उत्तर

4

बस आपने जो किया है उसकी प्रक्रिया के आउटपुट से पढ़ें।

मेरे पास मैक कंप्यूटर नहीं है, लेकिन यह वही होना चाहिए। कोड में टिप्पणियां देखें।

आपकी आर स्क्रिप्ट में मेरी मशीन पर त्रुटि है, इसलिए यह stdout के बजाय stderr को आउटपुट करता है।

using UnityEngine; 

public class RunR : MonoBehaviour 
{ 
    void Start() 
    { 
     System.Diagnostics.Process process = new System.Diagnostics.Process(); 
     // For macOS, here should be 
     //  I. "/bin/sh" 
     //  II. "path_of_the_Rscript" 
     process.StartInfo.FileName = @"E:\Program Files\R\R-3.3.2\bin\x64\Rscript.exe"; 
     // For macOS, here should be 
     //  I. "-c path_of_the_Rscript Rexp1.R" if "/bin/sh" is used 
     //  II. "Rexp1.R" if "path_of_the_Rscript" is used 
     process.StartInfo.Arguments = "Rexp1.R"; 
     process.StartInfo.WorkingDirectory = Application.dataPath; 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.RedirectStandardOutput = true; 
     process.StartInfo.RedirectStandardError = true; 
     process.Start(); 
     //read the output 
     string output = process.StandardOutput.ReadToEnd(); 
     string err = process.StandardError.ReadToEnd(); 
     process.WaitForExit(); 
     Debug.Log(output); 
     Debug.LogError(err); 
    } 
} 

ouput:

Ouput

नोट परियोजना दृश्य। Rexp1.R और RunR.cs हैं। पहला आउटपुट Object है, क्योंकि स्टडआउट से कोई आउटपुट नहीं है और इस प्रकार आउटपुट शून्य है।

बाद मैं निम्नलिखित करने के लिए Rexp1.R की सामग्री बदल,

print("12345") 
print("ABCDE") 

सांत्वना ध्यान में रखते हुए उत्पादन हो जाता है:

normal output

अद्यतन:

स्थापित करने के बाद igraph पैकेज और sink("output.txt") और अंतिमको हटा रहा है, उत्पादन होता है:

possible correct output

+1

आर स्क्रिप्ट ने एक त्रुटि फेंक दी क्योंकि आपको igraph लाइब्रेरी को स्थापित करने की आवश्यकता है। लाइब्रेरी को स्थापित करने के लिए आदेश को कोड में जोड़ा जा सकता है या आर कमांड टर्मिनल से चलाया जा सकता है: 'install.packages ("igraph")'। मैं अभी भी बाकी सब कुछ देख रहा हूं लेकिन ऐसा लगता है कि इसे काम करना चाहिए। किसी भी मामले में, धन्यवाद! – CodeGuyRoss

+0

हाँ, यह काम करता है। :) जवाब अद्यतन किया गया है। – zwcloud

+0

हाँ, मैं यह काम करने में सक्षम था। मुझे एक मिनट लग गया क्योंकि मैं वर्किंग डायरेक्टरी असाइनमेंट में फ़ोल्डर पथ से पहले '/' जोड़ना भूल गया। process.StartInfo.WorkingDirectory = Application.dataPath + "/ स्क्रिप्ट्स"। मुझे यह मिलने के बाद, सबकुछ अच्छा था। सहायता के लिए धन्यवाद! – CodeGuyRoss

संबंधित मुद्दे