2016-10-27 14 views
6

Có cách nào để chạy tập lệnh R sử dụng C# của Unity trong Mono không?Có thể chạy Mã R từ Unity C# trong Mono hoặc .NET trên OSX không?

Nếu không có cách nào để chạy một kịch bản R sử dụng Mono, tôi sẵn sàng để sử dụng NET

Cập nhật

Vì vậy, các mã sau đây sẽ gọi kịch bản R nhưng sẽ không ra một tập tin nếu được gọi là từ phát triển đơn điệu đoàn kết. Nó sẽ là ok để trả về một chuỗi để mono nhưng thay đổi đúng và sai trên startInfo.UseShellExecute và startInfo.RedirectStandardOutput ném một lỗi. Đây là mã C# sẽ gọi mã R:

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

Tôi biết chắc chắn rằng tập lệnh R sẽ xuất ra một tệp hoặc tôi có thể lấy stdout và giữ nó. Tôi sẽ được hạnh phúc với xuất ra một tập tin hoặc có sự thống nhất cho phép cho một chuỗi được trả lại đó là đầu ra của kịch bản R.

Cập nhật 2 * - Đây là tập lệnh R.

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

Tôi biết rằng r.Net sử dụng một khuôn khổ đó là quá cao đối với Unity – CodeGuyRoss

+0

Tại sao các bạn thậm chí cố gắng để làm điều này? Đối với một plugin hoặc bạn chỉ muốn làm cho trò chơi của bạn với R? – Programmer

+1

Tôi muốn sử dụng một số chức năng được xây dựng trong R. R là một ngôn ngữ nghiên cứu khoa học rất mạnh và nó có thể được sử dụng để viết tắt nhiều hoạt động. Tôi cho rằng bạn có thể sử dụng nó cho một trò chơi nhưng tôi đang nghiên cứu. – CodeGuyRoss

Trả lời

4

Chỉ đọc từ đầu ra của quy trình giống như những gì bạn đã làm.

Tôi không có máy tính MAC nhưng phải giống nhau. Xem nhận xét trong mã.

Tập lệnh R của bạn có lỗi trên máy tính của tôi, do đó, nó xuất ra stderr thay vì stdout.

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

Lưu ý quan điểm dự án. Có Rexp1.RRunR.cs. Đầu ra đầu tiên là Object, bởi vì không có đầu ra từ stdout và do đó đầu ra là null.

Sau khi tôi thay đổi nội dung của Rexp1.R đến sau,

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

đầu ra trong giao diện điều khiển xem trở thành:

normal output

UPDATE:

Sau khi cài đặt gói igraph và xóa sink("output.txt") vàcuối cùng, đầu ra là:

possible correct output

+1

Kịch bản lệnh R đã ném một lỗi vì bạn cần cài đặt thư viện igraph. Lệnh để cài đặt thư viện có thể được thêm vào mã hoặc chạy từ thiết bị đầu cuối lệnh R: 'install.packages ("igraph")'. Tôi vẫn đang kiểm tra mọi thứ khác nhưng có vẻ như nó sẽ hoạt động. Trong mọi trường hợp, cảm ơn! – CodeGuyRoss

+0

Có, hoạt động. :) Câu trả lời được cập nhật. – zwcloud

+0

Vâng, tôi đã có thể làm việc này. Tôi mất một phút vì tôi quên thêm '/' trước đường dẫn thư mục trong nhiệm vụ workingdirectory. process.StartInfo.WorkingDirectory = Application.dataPath + "/ Scripts". Sau khi tôi phát hiện ra, mọi thứ đều tốt. Cảm ơn đã giúp đỡ! – CodeGuyRoss

Các vấn đề liên quan