13

RODBC ライブラリを使用してデータを R に取り込みます。このSO ユーザーのように、変数を渡したい長いクエリがあります。

問題は、R がクエリの空白/キャリッジ リターンを newline として解釈すること'\n'です。

この質問に対して受け入れられている解決策は、テキストをチャンクに分割してからpaste()一緒にすることを提案しています-これは機能しますが、理想的には空白をそのままにしておきたいです-データベースでのクエリの動作のテスト/検証を容易にしますRに貼り付ける前に.

私がよく知っている他の言語では、単純な行継続文字があります。実際、受け入れられた回答に対するコメントのいくつかは、 python の\.

strwrapR ディスカッション リストの奥深くで使用する回避策を見つけたので、インターネットをより良くするために、ここに投稿します。ただし、誰かがよりエレガントで簡単なソリューションへの方向性を示すことができれば、喜んであなたの答えを受け入れます.

4

4 に答える 4

18

これが役立つかどうかはわかりませんが、最終的には、SQL を R スクリプトから分離することに引き寄せられました。非常に短いものを除いて、クエリを R スクリプトに保持すると、すぐに読めなくなることがわかりました。

最近では、1 行以上のクエリを個別の .sql ファイルに保持する傾向があります。次に、それらを素敵なテキスト エディターで適切に書式設定して読みやすくし、必要に応じて次のような方法で R に読み込むことができます。

read_sql <- function(path){
    stopifnot(file.exists(path))
    sql <- readChar(path,nchar = file.info(path)$size)
    sql
}

パラメータをクエリにバインドするため%sに、.sql ファイル内でパラメータを格納する場所を保持し、R を使用してパラメータを追加しますsprintf

paste非常に長いステートメントと複数行の文字オブジェクトで R スクリプトを乱雑にすると、コードが非常に読みにくくなっていることに気付いたので、私はこの方法で非常に満足しています。

于 2012-11-14T18:15:14.793 に答える
13

ドキュメントstrwrapに従って、Rは改行文字を含む空白を破棄します。

基本的に、最初にRに改行/改行を導入させ\n、すぐにそれらを取り除くことで、目的の動作を得ることができます。

#make query using PASTE
query_1 <- paste("SELECT map.ps_studentid 
      ,students.first_name || ' ' || students.last_name AS full_name
      ,map.testritscore
      ,map.termname
      ,map.measurementscale
FROM map$comprehensive_with_growth map
JOIN students 
  ON map.ps_studentid = students.id
WHERE map.termname = '",map_term,"'", sep='')

#remove newline characters introduced above.  
#width is an arbitrary big number-
#it just needs to be longer than your string.
query_1 <- strwrap(query_1, width=10000, simplify=TRUE)

#execute the query 
map_njask <- sqlQuery(XE, query_1)
于 2012-11-14T18:02:44.823 に答える
11
query <- gsub(pattern='\\s',replacement="",x=query)
于 2014-03-21T15:28:43.773 に答える
0

sprintf を使用して変数置換を取得してから、すべての改行と空白を置き換えてみてください。

詳細については、同様の質問に対する私の回答を参照してください。

于 2013-03-28T15:29:35.777 に答える