2017-09-23 108 views
1

我解析與F#一個CSV的CsvProvider併成功創建了兩個列表繪製小數清單:問題與F#的R型提供商

let times = [ for row in airinfo.Rows -> row.Time ]

let passengers = [ for row in airinfo.Rows -> row.AirPassengers ]

times是一個小數列表和passengers是一個int列表。

最終我試圖運行: R.plot (times, passengers)

對於初學者來說,雖然R.plot passengers作品,但R.plot times沒有,這使我相信這個問題是在密謀小數清單。

我得到以下異常:

System.Exception的:沒有轉換器類型 Microsoft.FSharp.Collections.FSharpList`1 [System.Decimal,mscorlib程序, 版本= 4.0.0.0註冊,在 微軟0:培養=中性公鑰= b77a5c561934e089]]或 任何其基本類型

[email protected]的(System.String 消息)[0x00001]在< 57161c90b86b2a10a7450383901c1657>。 FSH arp.Core.PrintfImpl + StringPrintfEnv 1[TResult].Finalize () [0x00012] in <5893d081904cf4daa745038381d09358>:0   at [email protected][TState,TResidue,TResult,A].Invoke (Microsoft.FSharp.Core.FSharpFunc 2 [T,TResult] ENV,A一)[0x00038]在 < 5893d081904cf4daa745038381d09358>:0在 [email protected] [T2,TResult,T1]。調用 (T2 U)[0x00001]在< 5893d081904cf4daa745038381d09358>:0在 RProvider.RInteropInternal.convertToR [法菜單(RDotNet.REngine發動機, 法菜單值)[0x00061]在< 57161c90b86b2a10a7450383901c1657>:0在 RProvider.RInteropInternal。 REngine.SetValue(RDotNet.REngine this, System.Object value,Microsoft.FSharp.Core.FSharpOption 1[T] symbolName) [0x00001] in <57161c90b86b2a10a7450383901c1657>:0   at RProvider.RInteropInternal.toR (System.Object value) [0x00019] in <57161c90b86b2a10a7450383901c1657>:0   at [email protected] (System.Collections.Generic.List 1 [T] tempSymbols,System.Object arg)[0x00123] in < 57161c90b86b2a10a7450383901c1657>:0在 [email protected] (System.Collections.Generic.IEnumerable 1[System.String]& next) [0x000d8] in <57161c90b86b2a10a7450383901c1657>:0   at Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase 1 [T] .MoveNextImpl ()[0x00017]在< 5893d081904cf4daa745038381d09358>:0在 微軟。 FSharp.Core.CompilerServices.GeneratedSequenceBase 1[T].System-Collections-IEnumerator-MoveNext () [0x00001] in <5893d081904cf4daa745038381d09358>:0   at System.Collections.Generic.List 1 [T] ..構造函數 (System.Collections.Generic.IEnumerable 1[T] collection) [0x00077] in <48b95f3df5804531818f80e28ec60191>:0   at Microsoft.FSharp.Collections.SeqModule.ToArray[T] (System.Collections.Generic.IEnumerable 1 [T]源)[0x0006a]在 < 5893d081904cf4daa745038381d09358>:0在 RProvider.RInterop.callFunc(系統.String packageName,System.String funcName,System.Collections.Generic.IEnumerable`1 [T] argsByName, System.Object [] varArgs)[0x0001d] in < 57161c90b86b2a10a7450383901c1657>:0在 $ FSI_0012.main @()[0x0002f]在 < 511174b5879343f6b1c4aa72a97ef951>:0在(包裝紙 管理到本機)System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod ,對象,對象[],在 System.Reflection.MonoMethod.Invoke(System.Object的物鏡, System.Reflection.BindingFlags invokeAttr,System.Reflection.Binder 粘合劑,System.Object的[]參數的System.Exception &),系統。Globalization.CultureInfo 培養物)[0x00032]在< 48b95f3df5804531818f80e28ec60191>:0

任何幫助不勝感激。

+0

將異常文本重新格式化爲塊引用 –

+0

R提供程序相當低級別,並且它不知道某些F#(如選項)和.NET類型。只需將您的小數轉換爲浮點數或其他可以由其消化的數字格式即可。你也可能需要裝箱。你可以添加你打來的完整代碼嗎?這作爲例子不能被再現。 – s952163

回答

0

您需要將十進制列表轉換爲RProvider知道的數字類型。下面是對我工作的例子:

#load @"..\packages\RProvider\RProvider.fsx" 

open System 
open RDotNet 
open RProvider 
open RProvider.graphics 

let floatList = [1. ..10.] 
let decList = [1M .. 10M ] 

R.plot(floatList) // this works 
R.plot(decList) // Syystem.exception 

System.Exception的:否類型 Microsoft.FSharp.Collections.FSharpList`1 [System.Decimal,mscorlib程序, 版本= 4.0.0.0註冊轉換器,CUL TURE =中性公鑰= b77a5c561934e089]] 或任何其基本類型

但是您可以將列表轉換成另一種類型的:

decList 
|> List.map float 
|> R.plot 

enter image description here

另外,如果你想用一個列表作爲一個標籤,也許你應該轉換爲字符串,而不是浮動正如我上面一樣。