2015-10-12 49 views
-1

我使用R.NET在C#中調用R函數。雖然這樣做,我意識到每次我調用一個函數,我需要指定它的類型。避免提及c#中使用Rd函數調用R函數時的數據類型的方法

比如:

engine.Evaluate("x = 3.5:10.5"); 

      NumericVector a1= engine.GetSymbol("x").AsNumeric(); 

對於上述代碼我需要指定a1爲數字向量。

engine.Evaluate("x = c('a',3,7,'adad', 'xyz')"); 
      CharacterVector a2 = engine.GetSymbol("x").AsCharacter(); 

對於此代碼,我需要指定a2是一個字符向量。

有沒有什麼辦法可以知道數據的類型?或者使用適用於所有數據類型/對象的通用東西?

任何幫助表示讚賞。 提前感謝您。

+0

您可以使用class(a2)來查找數據類型。您也可以使用is.character(a2)來檢查它是否符合要求 – Bas

+0

謝謝@Heuer的回覆,但它不工作我甚至不想使用'CharacterVector a2 = engine.GetSymbol(「x」 ).AsCharacter();'這一行。因爲它已經提到了數據類型。我只需要使用一些能告訴我什麼是'engine.Evaluate(「x = c('a',3,7,'adad','xyz')」)中使用的字符串的數據類型;''基本上什麼是「x」的類型? – Artiga

+0

''class(c('a',3,7,'adad','xyz'))''[1]「character」'它適用於我在R.也許嘗試分裂它。 'x < - c('a',3,7,'adad','xyz')''engine.Evaluate(x);' – Bas

回答

3

爲什麼不引用只是保存到符號

engine.Evaluate("x = 3.5:10.5"); 
var a1 = engine.GetSymbol("x"); 
+0

非常感謝您的回覆。 'engine.Evaluate(「x = c('a',3,7,'adad','xyz')」); CharacterVector a2 = engine.GetSymbol(「x」)。AsCharacter(); string [] b2 = a2.ToArray(); (「(」+ string.Join(「,」,b2)+「)」);' 我想在消息框中顯示輸出。當我使用'var'時,我無法將a1轉換爲數組,因此無法在消息框中顯示。 – Artiga

+0

另外,我試着直接在消息框 'engine.Evaluate(「x = list(a = c(3.5:10.5),b ='aaa')」); var a1 = engine.GetSymbol(「x」); MessageBox.Show(「(」+ string。加入(「,」,a1)+「)」);' 但消息框顯示 「RDotNet.SymbolicExpression」 – Artiga

2

在之前的評論,你可以使用engine.Evaluate("class(x)").AsCharacter().ToArray()得到將R對象的類(ES)提及。

在R.NET中父類型SymbolicExpression有一些方法來動態查詢類型,但是這不包括所有情況。有一些東西如:

SymbolicExpression blah = engine.GetSymbol("blah"); 
bool isList = blah.IsList(); 

但沒有方法,如IsCharacter()。我注意到將類型檢查方法的範圍擴展爲一個功能請求。

廣義地說,R是動態類型的,C#是靜態類型的。我理解你要求的是將R動態類型投影到C#中;這是(實際上)不可能的。如果您願意嘗試F#,則F# R Provider提供了您似乎在尋找的一些功能。

相關問題