2016-09-02 8 views
1

option floatのシーケンスをF#にRProviderに渡したいと思っています。 Some floatNoneの浮動小数点数列を持つ場合、Noneの値をRRProviderでどうやって得ることができますか?私はNone sがRNA値と等価になると予想しているだろうが、私は、私はマルチを取得F#からRProviderにseq <floatオプション>を渡す

open System 
open RDotNet 
open RProvider 
open RProvider.graphics 
open RProvider.stats 

let optData4 = 
    seq [Some 10.0; Some 9.0; Some 8.0; None; Some 6.0; 
     Some 5.0; Some 5.0; None; Some 4.0; Some 2.0; 
     None] 

let testData4 = 
    namedParams [ 
     "regPrice", optData4;] 
    |> R.data_frame 

で、seq<option float> R.

例えば

に渡すことができません-lineエラー:

System.Exception: No converter registered for type Microsoft.FSharp.Collections.FSharpList`1[[Microsoft.FSharp.Core.FSharpOption`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FSharp.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]] or any of its base types 
> at RProvider.RInteropInternal[email protected](String message) in C:\Tomas\Public\bmc\FSharp.RProvider\src\RProvider\RInterop.fs:line 164 
    at RProvider.RInteropInternal.REngine.SetValue(REngine this, Object value, FSharpOption`1 symbolName) in C:\Tomas\Public\bmc\FSharp.RProvider\src\RProvider\RInterop.fs:line 274 
    at RProvider.RInteropInternal.toR(Object value) in C:\Tomas\Public\bmc\FSharp.RProvider\src\RProvider\RInterop.fs:line 287 
    at [email protected](List`1 tempSymbols, Object arg) in C:\Tomas\Public\bmc\FSharp.RProvider\src\RProvider\RInterop.fs:line 461 
    at [email protected](IEnumerable`1& next) in C:\Tomas\Public\bmc\FSharp.RProvider\src\RProvider\RInterop.fs:line 469 
    at Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1.MoveNextImpl() 
    at Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1.System-Collections-IEnumerator-MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at Microsoft.FSharp.Collections.SeqModule.ToArray[T](IEnumerable`1 source) 
    at RProvider.RInterop.callFunc(String packageName, String funcName, IEnumerable`1 argsByName, Object[] varArgs) in C:\Tomas\Public\bmc\FSharp.RProvider\src\RProvider\RInterop.fs:line 466 
    at <StartupCode$FSI_0012>[email protected]() in C:\Users\sranney\repositories\carolina_refit_bits\refit_bits\refit_bits\RDemo.fs:line 102 
Stopped due to error 

私はにseq<option float>を変換する場合、私はRProviderに何かを渡すことができる唯一の方法であります

let optData4 = 
    seq [Some 10.0; Some 9.0; Some 8.0; None; Some 6.0; 
     Some 5.0; Some 5.0; None; Some 4.0; Some 2.0; 
     None] 
    |> Seq.choose id 

let testData4 = 
    namedParams [ 
     "regPrice", optData4;] 
    |> R.data_frame 

とが、これは私が考えはRNA値に匹敵するだろうこれは、(なしのオプションを持つことの目的を否定。

はどのような値のいくつかはF#Noneあり、RNAあるべきRProviderに一連の値を渡すことができますか?あなたがDeedleとNULL可能な値でそれを行うことができます

+0

私は絶対にFナレッジは持っていませんが、R 'NA'は実際には特定のNA値を各スーパーモードで包含しています。ヒッチが "浮動小数点"である場合は、NA_real_を返す必要があるかもしれません。 –

答えて

3

私は(これが原因でR NAで、完全に適切ではないあなただけのnanNone値を置き換えることがこれを行うことができるはずだと思うし、 NaNは異なっているが、F#でのフロートのための2つの異なる非値)を表現する方法はありません。

let optData4 = 
    [ 10.0; 9.0; 8.0; nan; 6.0; 5.0; 5.0; nan; 4.0; 2.0; nan ] 

let testData4 = 
    namedParams [ 
     "regPrice", optData4;] 
    |> R.data_frame 

私はこれをテストしていませんが、私は、これは我々が内部Deedleに何をすべきかと思います。

+2

うまくいった。私は単純な関数を使用して値に変換しました/ nana: 'let toNan x = xに |いくつかのx - > x | None - > nan'とし、そうでない場合はすべてを 'R'に渡した。 – Steven

3

let toNullable = 
     function 
     | None -> Nullable() 
     | Some x -> Nullable(x) 

let optData4 = 
    seq [Some 10.0; Some 9.0; Some 8.0; None; Some 6.0; 
     Some 5.0; Some 5.0; None; Some 4.0; Some 2.0; 
     None] 
    |> Seq.map(toNullable) 

let series = Series.ofNullables(optData4) 

let testData4 = 
    namedParams [ 
     "regPrice", series;] 
    |> R.data_frame 
+1

'Option.toNullable'はF#4.0以降に組み込まれているため、独自のバージョンを定義する必要はありません。 –

関連する問題