2017-02-15 9 views
0

RinRubyを使ってRアルゴリズムをRailsでラップするrails APIを作成しました。RinRubyのR配列(Rリスト内)にルビー配列を変換します

Rアルゴリズムが必要とするパラメータは、文字列、数字、および配列で構成されるRリストとして渡されます。

リストに配列がない場合は、RinRubyを使用してリストをRアルゴリズムに渡すことができます。これにはCSVを生成します。しかし、リスト内に配列がある場合、配列は文字列に変換されます。私は、変換されたリスト内のルビ配列をR配列に変換する方法を理解できません。ここ

はRアルゴリズムを呼び出すRinRubyコードである:ここ

def algorithm 
    R.eval <<-EOF 
     list <- get_algorithm(#{mapped_filter_values_to_csv}, #{mapped_filter_names}) 
     result = toJSON(list) 
    EOF 
end 

は、リストを作成する方法であって、ここで

def mapped_filter_values_to_csv 
    "list(#{CSV.generate_line(converted_filter_values.map{|filter_value| map_individual_value filter_value}, :row_sep=>"")})" 
end 

(前メソッドによって呼び出さ)map_individual_value方法であって:

def map_individual_value filter_value 
    if filter_value.class == Array 
     "c(#{CSV.generate_line(filter_value, :row_sep=>"")})" 
    elsif filter_value.class == String 
     "\'#{filter_value}\'" 
    else 
     filter_value 
    end 
end 

ここでは、現在起こっていることの例を示します。「c(1 、9)」Rの文字列として:ここで

list <- get_algorithm(list("c(1,9)",'M', 1), c("filter1", "filter2", "filter3")) 

私はRの配列としてC(1,9)と、起こるために必要なものです:

list <- get_algorithm(list(c(1,9),'M', 1), c("filter1", "filter2", "filter3"))`enter code here` 

すべてのアイデアは、変換する方法Ruby配列をR配列に追加する

ありがとうございます!

+0

。したがって、あなたの入力を正確に表現するために、全体を引用します。 CSVでは、引用符を付けずに、 'c(1'、' 9) '' M'''と '1'の4つの要素を持つリストがあることに注意してください。 これは私に、最初にCSVを使用している理由についての質問を残します。私はRに精通していませんが、無関係で不適切なデータ形式に変換することで、自分自身を難しくしていると思います。 – philomory

答えて

2

問題は、CSVは独自のデータ形式であり、カンマの使用が許可されている場所についての非常に具体的なルールがあることです。また、かっこは分かりません。 CSVに関する限り、元のリストには、c(1,9),'M'1の4つの要素があります。これを避けるには、c(1,9)が引用されます。CSVの仕組みだからです。

多くの結合を使用して自分自身を完全にCSVを回避し、文字列表現を構築することが容易とマップ:これは、あなたがCSV.generate_lineを使用しているためで、CSVでの個々の裸の要素はコンマを含むことを許可されていません

def mapped_filter_values_to_csv 
    values = converted_filter_values.map{|filter_value| map_individual_value filter_value} 
    "list(#{ values.join(',') })" 
end 

def map_individual_value filter_value 
    if filter_value.class == Array 
    values = filter_value.map {|v| map_individual_value(v) } 
    "c(#{values.join(',')})" 
    elsif filter_value.class == String 
    "\'#{filter_value}\'" 
    else 
    filter_value 
    end 
end 
+0

お返事ありがとうございます!私がCSVを使用している理由は、カンマで区切って型を保持する必要があるからです(list( 'M'、1)など)。値を結合すると、文字列をリストに渡します:list( "M、1")、これはRアルゴリズムの有効な引数ではありません。だから、CSV生成はリストレベルで動作しますが、CSVを使ってルビ配列からR配列(リスト内)に変換しようとすると、文字列補間を使用しなければならず、すべてが文字列として渡されます例えば ​​"c(1,9)")。私があなたのアプローチを使用すると、私は「c( '1,9')」を得て、得たいのはc(1,9)です。 – erica

+0

'converted_filter_values'の戻り値の例を挙げることができますか?私はそれが[[1,9]、 "M"、1] 'であると期待しています。そうであれば、 'mapped_filter_values_to_csv'の戻り値は私のテストでは正確に' 'list(c(1,9)、 'M'、1)" 'です。 – philomory

+1

また、CSVではすべてが文字列です。 CSVはRubyの型やRの型について何も知らないので、 "それを型にしておく"と思われるものはすべて偶然である。 Rubyの標準ライブラリのCSVジェネレータでもRubyの型は分からず、CSVに格納されるすべてのものについて "to_s"を呼び出し、結果の文字列に予約文字が含まれているかどうかを確認します。そうでなければ、それを現状どおりに置く。もしそうであれば、それは引用符で囲まれている(それはもう少しだが、それほど多くはない)。 – philomory

関連する問題