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제 1 라인의 끝에서 키; 그러나 그것은 작동하지 않습니다.

감사.

답변:


107

여러 줄로 코드 를 나누지 않고 단일 식별자 . 차이가 있습니다.

문제의 경우 시도해보십시오

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

또한 여러 줄에 걸쳐 코드를 나누는 것이 완벽하다는 것을 보여줍니다.


13
감사! 코드가 다음 줄에서 계속된다는 것을 R에게 알리기 위해 줄 끝에 넣을 수있는 문자가 있는지 궁금합니다. 파이썬에서 "\"와 같은. 그러나 솔루션은 문자열 연속의 특정 문제에 효과적입니다.
Curious2learn

14
또는 paste (..., sep = "")와 동등한 paste0 (...)을 사용하는 것이 좋습니다.
gkcn

31
그러나 paste02 년 전에 답변을 썼을 때 아직 존재하지 않았습니다.
Dirk Eddelbuettel

수정이 거부 된 것으로 보이며 거부에 다소 동의합니다. 대답은 여전히 ​​올 바르고 상황과 의견이 업데이트됩니다.
Dirk Eddelbuettel

고마워 긴 줄을 나누려면 더하기를 사용해야한다고 잘못 배웠습니다. 현실이 훨씬 단순해서 다행입니다!
Iain Samuel McLean Elder

143

바, 댓글이 너무 작습니다. 어쨌든 @Dirk는 매우 옳습니다.

R은 다음 줄에서 코드가 시작된다고 말할 필요가 없습니다. 그것은 파이썬 ;-)보다 더 똑똑하며 문장이 "완료되지 않은"것으로 간주 될 때마다 다음 줄을 계속 읽을 것입니다. 실제로, 귀하의 경우에도 다음 줄로 갔지만 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()또는 paste0()더크 제안합니다.


고마워 조리스 나는 당신이 일부 온라인 문서에서 제공 한 것과 비슷한 예제를 보았고 문자열에서도 시도했습니다. 닫는 따옴표가 없으면 다음 줄로 계속 이어질 것이라고 생각했습니다. 그러나 문자열을 사용하면 작동하지 않거나 오히려 줄 바꿈 문자로 입력한다는 점에서 다른 방식으로 작동합니다.
Curious2learn

가끔 더하기 기호로 선을 나눌 수 있는지 명확하게 해주셔서 감사합니다 !
Iain Samuel McLean Elder

8
아니요, 여기는 파이썬보다 똑똑하지 않습니다. 오히려 paste("~one",\n"/two")당신이 필요합니다 ("~one" \n "/two"). 쉼표와을 삭제하십시오 paste. 언어 스맥 다운이 보이지 않습니다. 나는 두 언어를 모두 사용하지만 붙여 넣기는 항상 성가신 일이었습니다.
Phil Cooper

2
@JorisMeys 맞아, 나는 그 잘못을 고치려고 노력했다. parens를 사용하면 줄 연속에 "\"가 필요하지 않습니다. 좋아 당신은 또한 당신이 "\"구문을 할 수없는 라인에 대한 의견 (예를 가질 수 있기 때문에 ("one"\n "/one.one" # some comment\n "/two")' 의 예 stackoverflow.com/questions/10660435/...을
필 쿠퍼

1
leaving a bracket open, or ending the line with an operator이 두 가지 방법이 있습니다.
SIslam

35

Dirk의 방법은 절대적으로 효과가 있지만 공백 / 구조가 보존되어야하는 긴 문자열을 가져 오는 방법을 찾고 있다면 (예 : RODBC를 사용하는 SQL 쿼리) 두 단계 솔루션이 있습니다.

1) 텍스트 줄을 여러 줄로 가져옵니다.

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

2) R은 많은 \n문자를 소개합니다 . 설명서에strwrap() 따라 공백을 제거하는을 사용하여 제거 하십시오 .

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

strwrap이 텍스트를 매우 긴 줄로 감싸도록 지시하면 공백 / 줄 바꿈 문자가없는 단일 문자 벡터를 얻게됩니다.


3
문자열이 다소 길면 붙여 넣기와 같이 쉼표를 너무 많이 쓸 필요가 없기 때문에이 대답이 가장 마음에 듭니다. +1
user3032689

3
strwrap소스 문자열이 10k자를 초과하지 않더라도 여러 문자열의 벡터를 반환 할 수 있습니다. 시도하십시오 strwrap("a\n\nb"). 길이가 3 인 벡터를 반환 paste(strwrap("a\n\nb"), collapse=" ")하고 공백 문자 접착제를 사용 하여 벡터를 축소하여 벡터 를 붙여야합니다 .
Gedrox

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 chaining Syntax와 같은 코드가 있으면 조금 어려워집니다. 예를 들어 이런 문제가있었습니다.

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의 질문과 관련이 없습니다.
zerweck

그렇습니다. 주요 질문은 코드 줄을 여러 줄로 나누는 방법입니다. 나는 원래 질문보다 조금 더 복잡한 다른 예제를 사용하여 시연했다. 특정 코드 조각을 나누는 방법을 알아 내려고 많은 시간을 보냈기 때문에 게시해야한다고 생각했습니다. 그리고 나는 그것이 비슷한 문제를 가진 사람을 도울 것이라고 생각합니다.
M Terry

OP의 문제는 문자 벡터를 줄 바꿈으로 나누면 문자 벡터에 줄 바꿈이 포함된다는 것입니다. 귀하의 답변은 data.table 구문에만 해당됩니다
zerweck

한 줄의 코드를 여러 줄로 나누는 예
M Terry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.