2016-10-27 36 views
6

Mono'da Unity's C# kullanarak bir R komut dosyasını çalıştırmanın bir yolu var mı? Mono kullanarak bir R komut dosyasını çalıştırmak için hiçbir yolu varsaMono veya .NET'te OSX'teki R Kodunu Unity C#'dan Çalıştırmak mümkün mü?

, ben

Güncelleme

Yani şu kod R komut arayacak .NET kullanmaya hazırım ama çıkış bir dosya olmaz birlik monodevelop çağrılırsa. Monoya bir dize döndürmek ancak startInfo.UseShellExecute ve startInfo.RedirectStandardOutput üzerinde doğru ve yanlışları değiştirmek bir hata atar.

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(); 

Ben R komut dizisi Bir dosya ya da ben stdout'u kapmak ve bunun üzerine tutabilir emin için biliyorum: Burada R kodu arayacak C# kodudur. Bir dosyaya vermekteyken ya da R biriminin çıktısı olan bir dizenin döndürülmesine izin veren bir birime sahip olmaktan memnun olurum. Güncelleştirme 2 * - İşte R komut dosyası.

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

Ben r.Net Unity – CodeGuyRoss

+0

için çok yüksek bir çerçeve Neden hala bunun yapmaya çalışıyorsun kullandığı biliyoruz? Bir eklenti için ya da sadece oyununuzu R ile yapmak ister misiniz? – Programmer

+1

R'de yerleşik bazı fonksiyonları kullanmak istiyorum. R çok güçlü bir bilimsel araştırma dilidir ve pek çok operasyonu kısaltmak için kullanılabilir. Sanırım bir oyun için kullanabilirsin ama araştırma yapıyorum. – CodeGuyRoss

cevap

4

Sadece yaptığınız gibi işlemin çıktısından okuyun.

Bir MAC bilgisayarım yok, ama aynı olmalı. Koddaki yorumları görün.

R komut dosyanızın makinemde bir hata var, bu nedenle stdout yerine stderr olarak çıktı.

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); 
    } 
} 

Çıkışı:

Ouput

Not proje görünümü. Bir Rexp1.R ve bir RunR.cs vardır. İlk çıktı Object, çünkü stdout'tan çıkış yok ve çıkış null. Ben aşağıdakine Rexp1.R içeriğini değiştirdi sonra

,

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

konsol görünümünde çıktı olur

:

normal output

GÜNCELLEME:

kurduktan sonra igraph paketi ve sink("output.txt") ve sonkaldırarak, çıktıdır:

possible correct output

+1

R komut dosyası, igraph kitaplığını yüklemeniz gerektiğinden bir hata attı. Kitaplığı yükleme komutu, koda eklenebilir veya R komutu terminalinden çalıştırılabilir: 'install.packages ("igraph")'. Hala her şeyi kontrol ediyorum ama işe yarayacak gibi görünüyor. Her durumda, teşekkürler! – CodeGuyRoss

+0

Evet, işe yarıyor. :) Cevap güncellendi. – zwcloud

+0

Evet, bu çalışmayı başardım. Bir dakika sürdü çünkü çalışma dizini atamasında klasör yolundan önce '/' eklemeyi unutuyorum. process.StartInfo.WorkingDirectory = Application.dataPath + "/ Scripts". Bunu bulduktan sonra her şey güzeldi. Yardım için teşekkürler! – CodeGuyRoss