2016-09-13 1 views
1

Es scheint, als ob die RTypeProvider nur namedParams des gleichen Typs verarbeiten kann. Ist das der Fall?So erstellen Sie einen Datentypen von mehreren Typen mit dem RTypeProvider

Zum Beispiel

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 

nicht funktioniert, wie ich einen Fehler auf dem

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

sagen x.Qty bekommen Wenn ich die Reihenfolge, in der thingForR let umkehren, dann bekomme ich den entgegengesetzten Fehler :

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

Hier ist der Fehler x.Which ist

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

Kann das Wörterbuch in der namedParams nicht unterschiedliche Typen haben? Wenn ja, wie können Sie einen Datenrahmen mit verschiedenen Typen in F # erstellen und an R übergeben?

+0

, die ein F # Fehler ist, willkommen zu Sprachen stark typisierte :-) Sie müssen 'es box'. Aber Sie haben auch ein Problem mit dem Optionstyp. Ich bin mir nicht sicher warum, aber es gibt keinen Konverter dafür. Lassen Sie mich zuerst nach der relevanten Antwort suchen. – s952163

Antwort

0

Sie müssen die Werte in das Wörterbuch einbetten. Auf diese Weise sind sie alle nur Objekte. Also:

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 

gibt mir:

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

Bitte beachten Sie Ihre vorherige Frage auf float option die Option list zu float list konvertieren. Auch string option wenn nötig.

Sie können durch Deedle gehen (wenn nicht für die Optionswerte):

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

übrigens die mehrere Karten und Option Umwandlung könnte hässlich aussehen, aber in Wirklichkeit, wenn Sie es viel verwenden, werden Sie am Ende definieren Hilfsfunktionen für sie. – s952163

+0

Ah-ha! Perfekt. Vielen Dank. Und ja, das Konvertieren der 'float Option' in' NaN' ist notwendig, da die 'string Option' in' null' umgewandelt wird. Habe gerade beschlossen, die Dinge nicht mit dieser Frage zu überladen. – Steven

Verwandte Themen