Rスクリプトのコードを複数行に分割する


137

Rスクリプトの行を複数の行に分割したい(長すぎるため)。それ、どうやったら出来るの?

具体的には、次のような行があります

setwd('~/a/very/long/path/here/that/goes/beyond/80/characters/and/then/some/more')

長いパスを複数の行に分割することは可能ですか?私は試した

setwd('~/a/very/long/path/here/that/goes/beyond/80/characters/and/
then/some/more')

return最初の行の終わりにキーを持ちます。しかし、それは機能しません。

ありがとう。

回答:


107

コードを複数行に分割するのではなく、単一の識別子を使用します。違いがあります。

あなたの問題については、試してください

R> setwd(paste("~/a/very/long/path/here",
               "/and/then/some/more",
               "/and/then/some/more",
               "/and/then/some/more", sep=""))

これは、コードを複数行に分割することも完全に問題ないことを示しています。


13
ありがとう!コードが次の行に続くことをRに示すために行末に置くことができる文字があるかどうか疑問に思いました。Pythonの「\」など。ただし、このソリューションは、文字列の継続という特定の問題に対してはうまく機能します。
Curious2learn

14
または、paste(...、sep = "")と同等のpaste0(...)を使用することをお勧めします
gkcn

31
しかしpaste0、2年以上前に答えを書いたときにはまだ存在していませんでした。
Dirk Eddelbuettel 2013

編集が拒否されたようです。私は多かれ少なかれ拒否に同意します。答えはまだ正しいです、そのコンテキストとコメントがそれを更新しています。
Dirk Eddelbuettel 2013

これをありがとう。長い行を分割するにはプラス記号を使用する必要があると誤って学習しました。現実がずっと単純なのは嬉しいです!
Iain Samuel McLean Elder 14年

142

ええと、コメントが小さすぎます。とにかく、@ Dirkは非常に正しいです。

Rは、コードが次の行から始まることを通知される必要はありません。これはPythonよりも賢く;-)、ステートメントが「終了していない」と見なされると、次の行を読み続けるだけです。実際、あなたの場合は次の行にも行きましたが、Rは ""の間に置かれたときの文字としてリターンを受け取ります。

心に留めておいてください。コードが完成していないことを確認する必要があります。比較する

a <- 1 + 2
+ 3

a <- 1 + 2 +
3

したがって、コードを複数の行に分散する場合、次のいずれかの方法で、Rが何かが来ていることを確認する必要があります。

  • ブラケットを開いたままにする、または
  • 演算子で行を終了する

文字列を話しているときもこれは機能しますが、少し注意する必要があります。引用符を開くと、Rは閉じるまで読み続けます。ただし、改行を含むすべての文字が文字列の一部として表示されます。

x <- "This is a very
long string over two lines."
x
## [1] "This is a very\nlong string over two lines."
cat(x)
## This is a very
## long string over two lines.

これが、この場合にコードが機能しない理由\nです。パスに改行文字()を含めることはできません。そのため、paste()or paste0()Dirkが提案するソリューションをより適切に使用する理由でもあります。


ジョリス、ありがとう。いくつかのオンラインドキュメントで提供したものと同様の例を見て、文字列に対しても試してみました。クロージングクォートがなければ次の行に続くと思いました。しかし、文字列では機能しません。つまり、あなたが言ったように、改行文字として入力するという意味で別の方法で機能します。
Curious2learn

なぜそれがクリアさせるためのおかげで、時にはあなたは、プラス記号で行を分割することができます!
Iain Samuel McLean Elder 14

8
いいえ、ここではpythonよりも賢くはありません。ではなく、paste("~one",\n"/two")あなただけ必要です("~one" \n "/two")。コンマとpaste。言語スマックダウンを探していません。私は両方の言語を使用していますが、貼り付けはいつも面倒でした。
Phil Cooper

2
@JorisMeysそうです、私はその虚偽の表現を修正しようとしていました。括弧を使用すると、行の継続に「\」は不要になります。「\」構文では実行できない行にコメントを付けることもできるため、気に入っています(例:stackoverflow.com/questions/10660435/…の("one"\n "/one.one" # some comment\n "/two")'
Phil Cooper、

1
leaving a bracket open, or ending the line with an operatorこれらの2つは進むべき道です。
SIslam 2017年

35

上記のDirkの方法は完全に機能しますが、空白/構造を維持することが重要な長い文字列を取り込む方法を探している場合(例:RODBCを使用したSQLクエリ)、2つのステップの解決策があります。

1)テキスト文字列を複数行にまとめる

long_string <- "this
is 
a 
long
string
with
whitespace"

2)Rは\nキャラクターの束を紹介します。ストリップとそれらのうちstrwrap()ごとに、空白を破棄し、ドキュメント

strwrap(long_string, width=10000, simplify=TRUE)

strwrapにテキストを非常に長い行にラップするように指示すると、空白や改行文字のない単一の文字ベクトルが得られます。


3
文字列がかなり長い場合、pasteのように多くのコンマを記述する必要がないため、この回答が最も好きです。+1
user3032689 2016年

3
strwrapソース文字列が10k文字を超えていなくても、複数の文字列のベクトルを返す可能性があることに注意してください。お試しくださいstrwrap("a\n\nb")。これは長さ3のベクトルを返しますpaste(strwrap("a\n\nb"), collapse=" ")。スペース文字の接着剤を使用して、ベクトルを折りたたみ、貼り付ける必要があります。
Gedrox、2016

17

その特定のケースのためにありますfile.path

File <- file.path("~", 
  "a", 
  "very", 
  "long",
  "path",
  "here",
  "that",
  "goes",
  "beyond",
  "80",
  "characters",
  "and",
  "then",
  "some",
  "more")
setwd(File)

0

私はこの投稿が古いことを知っていますが、このような状況があり、解決策を共有したいと思っています。上記のすべての答えはうまくいきます。しかし、data.tableチェーン構文にあるようなコードがある場合、少しやりがいがあります。例えば、私はこのような問題を抱えていました。

mass <- files[, Veg:=tstrsplit(files$file, "/")[1:4][[1]]][, Rain:=tstrsplit(files$file, "/")[1:4][[2]]][, Roughness:=tstrsplit(files$file, "/")[1:4][[3]]][, Geom:=tstrsplit(files$file, "/")[1:4][[4]]][時間_ [秒]<=12000]

上記の提案のほとんどを試しましたが、うまくいきませんでした。しかし、それらは内のコンマの後に分割できることがわかりました[]。での分割は][機能しません。

mass <- files[, Veg:=tstrsplit(files$file, "/")[1:4][[1]]][, 
    Rain:=tstrsplit(files$file, "/")[1:4][[2]]][, 
    Roughness:=tstrsplit(files$file, "/")[1:4][[3]]][, 
    Geom:=tstrsplit(files$file, "/")[1:4][[4]]][`time_[s]`<=12000]

あなたが答えようとした質問を混同していたのでしょうか?これはOPの質問とは関係ありません。
ツェルヴェック

それは持っています。主な問題は、コードの行をいくつかの行に分割する方法です。元の質問よりも少し複雑な別の例を使用して、そのことを示しました。特定のコードを分割する方法を理解するために多くの時間を費やしたので、投稿する必要があると思いました。そして、それは同様の問題を持つ誰かを助けると思います。
Mテリー

OPの問題は、改行で文字ベクトルを分割すると、文字ベクトルに改行が含まれることでした。あなたの答えはdata.table構文にのみ固有です
zerweck

コードの行を複数の行に分割する例
M Terry
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.