2016-09-13 5 views
1

RTypeProviderは同じタイプのnamedParamsしか処理できないようです。これは本当ですか?私はthingForR LETの順序を逆にした場合、その後、私は反対のエラーを取得するRTypeProviderを使用して複数のタイプのデータフレームを作成する方法

This expression was expected to have type 
    string 
but here has type 
    float option 

を言っx.Qty上のエラーを取得するよう

例えば、

open RDotNet 
open RProvider 

type foo = { 
    Which: string 
    Qty: float option 
    }  

let someFoos = [{Which = "that"; Qty = Some 4.0}; {Which = "other"; Qty = Some 2.0}] 

let thingForR = 
    namedParams [ 
     "which", someFoos |> List.map (fun x -> x.Which); 
     "qty", someFoos |> List.map (fun x -> x.Qty); 
     ] 
    |> R.data_frame 

は動作しません。 :

let thingForR = 
    namedParams [ 
     "qty", someFoos |> List.map (fun x -> x.Qty); 
     "which", someFoos |> List.map (fun x -> x.Which); 
     ] 
    |> R.data_frame 

ここで、のエラーは

This expression was expected to have type 
    float option 
but here has type 
    string 

namedParamsの辞書は異なるタイプではありませんか?そうであれば、F#で異なるタイプのデータフレームを作成してRに渡すことはできますか?

+0

F#のエラーですが、強くあなたが 'それをbox'する必要があります:-)型付け言語を歓迎します。しかし、オプションの種類にも問題があります。なぜ私はそれについてのコンバータがないのか分かりません。最初に関連する答えを探してみましょう。 – s952163

答えて

0

辞書内に値を入力する必要があります。そうすれば、彼らはすべてただの目的である。だから、:

let thingForR = 
    namedParams [ 
     "which", box (someFoos |> List.map (fun x -> x.Which)); 
     "qty", box (someFoos |> List.map (fun x -> x.Qty) |> List.map (Option.toNullable >> float)); 
     ] 
    |> R.data_frame 

は私を与える:

val thingForR :
SymbolicExpression = which qty
1 that 4
2 other 2

float listOption listを変換するためにfloat option上の前の質問を参照してください。また、必要に応じてstring optionあなたはDeedle(ないオプション値のためであれば)を介して行くことができる

let someFoos' = [{Which = "that"; Qty = 4.0}; {Which = "other"; Qty = 2.0}] 
let df' = someFoos' |> Frame.ofRecords 
df' |> R.data_frame 
+0

しかし、複数のマップとオプションの変換が醜いように見えるかもしれませんが、実際に多く使うと、そのためにヘルパー関数を定義することになります。 – s952163

+0

ああ!完璧。ありがとう。そして、 'stringオプション'を 'null'に変換するので、' floatオプション 'を' NaN'に変換する必要があります。ちょうどこの質問で物事を混乱させないことに決めました。 – Steven

関連する問題