Розбити код на кілька рядків у сценарії 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
або краще використовувати paste0 (...), що еквівалентно paste (..., sep = "")
gkcn

31
Але paste0ще не існувало, коли я писав відповідь ще 2 роки тому.
Дірк Еддельбюттель

Схоже, редагування було відхилено, і я більш-менш згоден з відхиленням. Відповідь все ще правильна, має її контекст і коментарі її оновлюють.
Дірк Еддельбюттель

Дякую за це Я ввів в оману, що вам потрібно використовувати плюс, щоб розділити довгі рядки. Я радий, що реальність набагато простіша!
Ієн Самуель Маклін Старший

143

Ба, коментарів занадто мало. У будь-якому випадку, @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()Дирком.


Дякую Йоріс. Я бачив приклади, подібні до тих, які ви подали в деяких онлайн-документаціях, і спробував це для рядка. Я думав, що якщо це не зустрінеться із заключною цитатою, воно продовжить до наступного рядка. Але з рядком це не працює, а точніше, як ви вже сказали, працює по-іншому в тому сенсі, який він приймає як новий символ рядка.
Curious2learn

Дякуємо, що ви зрозуміли, чому іноді ви можете розділити лінії зі знаком плюс!
Ієн Самуель Маклін Старший

8
ні, це не розумніше пітона тут. а не paste("~one",\n"/two")просто потрібно ("~one" \n "/two"). опустити коми і paste. Не дивлячись мовного присмаку. Я використовую обидві мови, але завжди, хоча паста була досадою.
Філ Купер

2
@JorisMeys Правильно, я намагався виправити це неправильне твердження. Використовуйте паролі, і вам не потрібно "\" для продовження рядка. Мені це подобається, тому що ви також можете мати коментарі до рядків, які ви не можете зробити із синтаксисом "\" (наприклад, ("one"\n "/one.one" # some comment\n "/two")' приклади в stackoverflow.com/questions/10660435/…
Phil Cooper

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
Мені найбільше подобається ця відповідь, тому що мені не потрібно писати стільки коми, як із пастою, якщо рядок досить довгий. +1
користувач3032689

3
Пам’ятайте, що strwrapможе повернути вектор декількох рядків, навіть якщо вихідний рядок не перевищує 10 К символів Спробуйте 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, що ланцюг синтаксису, це стає непростим завданням. наприклад, у мене була така проблема.

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]

Я спробував більшість запропонованих вище пропозицій, і вони не спрацювали. але я зрозумів, що їх можна розділити після коми через []. Розщеплення ][не працює.

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

Як приклад поділу рядка коду на кілька рядків
М Террі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.