sprintfで複数の埋め込み変数を持つSQLクエリを生成しようとしています。R:sprintf混合型変数のリスト
%s
というパラメータを持つSQLを別のファイルとして保存し、それをrの中から読み込みます。読みやすさを向上させるため、私はヘルパーを作成しました。
fillSQLQuery <- function(query, params){
#' fill query with params
do.call(sprintf, as.list(c(query, params)))
}
私のパラメータは、日付、要素、および文字列です。関数に直接渡すと、日付は整数に、私の因子はインデックス(?)に置き換えられます。一方、ベクトル全体をas.character
に変換すると、すべての要素を日付として文字列に処理し、すべての非文字列に対してNAまたは間違った結果を返します。
do.call(sprintf,
as.list(c(query,
c(as.character(startDateSequence[1]), # POSix DATE
as.character(endDateSequence[1]), # POSix DATE
lotTypes[1], id_list[1])))) # string, factor
私が今までに見つけた解決方法は、手動で日付とタイプを手動で文字に変換することです。しかし、私はそれを行うための任意の「明確な」方法があるかしら、ニシキヘビのように単純で堅牢な何か:
'query {p1}, {p2}'.format(p1=X, p2=Y)
これは仕事に不可能に近いですあなたの 'params'ベクトルのほんの一例がなくても有効です。最小限の再現可能な例を作成してください。 – Gregor
私は、その関数では、どのように 'params'をベクトルとして渡すのでしょうか? 'as.character'を実行する前に、ベクターはどのように見えるのですか?おそらく、異なる型のオブジェクトに対して' c() 'を使うとすぐにうんざりします。 – Gregor
あなたはどちらにも当てはまります - より明確になるようにベクトルの例を追加しました。 とはい。何らかの理由で、Rのベクトルがリストとして混合データ型をサポートしていると仮定しましたが、そうではありません。単純なリストとベクトルの置き換えの問題を解決: fillSQLQuery(クエリ、リスト(startDateSequence [1]、 endDateSequence [1]、 lotTypes [1]、ID_LIST [1])) –