Разделить код на несколько строк в скрипте 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ключом в конце первой строки; но это не работает.

Спасибо.

Curious2learn
источник

Ответы:

108

Вы разбиваете код не на несколько строк, а на один идентификатор . Есть разница.

Для вашей проблемы попробуйте

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
или лучше использовать paste0 (...), что эквивалентно paste (..., sep = "")
gkcn
31
Но paste0еще не существовало, когда я написал ответ 2+ года назад.
Дирк Эддельбюттель
Похоже, что редактирование было отклонено, и я более или менее согласен с отклонением. Ответ все еще правильный, имеет свой контекст и комментарии обновляют его.
Дирк Эддельбюттель
Спасибо за это. Я неправильно понял, что вам нужно использовать плюс для разделения длинных строк. Я рад, что реальность намного проще!
Иэн Сэмюэль Маклин, старейшина,
144

Бах, комментарии слишком малы. Во всяком случае, @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()или paste0()предложенным Dirk.

Йорис Мейс
источник
Спасибо, Джорис. Я видел примеры, подобные тем, которые вы дали в некоторой онлайн-документации, и пробовал это также для строки. Я думал, что если он не встретит заключительную кавычку, он перейдет к следующей строке. Но со строкой он не работает, или, скорее, как вы сказали, работает по-другому в том смысле, что он принимает ввод как символ новой строки.
Curious2learn
Спасибо за разъяснение, почему иногда вы можете разделить строки знаком плюс!
Иэн Сэмюэль Маклин Старейшина
8
нет, здесь не умнее питона а не paste("~one",\n"/two")просто нужно ("~one" \n "/two"). бросьте запятые и paste. Не смотря язык шлепает. Я использую оба языка, но всегда, хотя вставка была раздражением.
Фил Купер
2
@JorisMeys Правильно, я пытался исправить это искажение. Используйте скобки, и вам не нужно "\" для продолжения строки. Мне это нравится, потому что у вас также могут быть комментарии к строкам, которые вы не можете сделать с помощью синтаксиса "\" (например, ("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

Приведенный выше метод Дирка будет абсолютно работать, но если вы ищете способ ввести длинную строку, в которой важно сохранить пробел / структуру (например, SQL-запрос с использованием RODBC), есть двухэтапное решение.

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
3
Имейте в виду, что strwrapможет возвращать вектор из нескольких строк, даже если исходная строка не превышает 10 000 символов. Попробуй strwrap("a\n\nb"). Он вернет вектор длины 3, и вам нужно вставить его обратно, используя paste(strwrap("a\n\nb"), collapse=" ")пробел для склеивания вектора.
Gedrox
18

Для этого конкретного случая есть 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]]][time_ [с]<=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]
М Терри
источник
Может быть, вы перепутали вопрос, на который пытались ответить? Это не имеет ничего общего с вопросом ОП.
Цервек
Это имеет. Главный вопрос - как разбить строку кода на несколько строк. Я продемонстрировал это на другом примере, более сложном, чем первоначальный вопрос. Я думал, что это необходимо опубликовать, потому что я потратил много времени, пытаясь понять, как разбить этот фрагмент кода. И я думаю, это поможет кому-то с подобной проблемой.
М Терри
Проблема ОП заключалась в том, что разбиение вектора символов на разрыв строки включает разрыв строки в векторе символов. Ваш ответ относится только к синтаксису
data.table
Как пример разделения строки кода на несколько строк
М Терри