Dividir código em várias linhas em um script R

137

Eu quero dividir uma linha em um script R em várias linhas (porque é muito longo). Como faço isso?

Especificamente, eu tenho uma linha como

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

É possível dividir o caminho longo em várias linhas? eu tentei

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

com a returnchave no final da primeira linha; mas isso não funciona.

Obrigado.

Curious2learn
fonte

Respostas:

108

Você não está quebrando o código em várias linhas, mas em um único identificador . Há uma diferença.

Para o seu problema, tente

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

o que também ilustra que é perfeitamente bom quebrar o código em várias linhas.

Dirk Eddelbuettel
fonte
13
Obrigado! Eu queria saber se havia um caractere que eu poderia colocar no final da linha para indicar para R que o código continua na próxima linha. Como "\" em Python. No entanto, sua solução funciona bem para o problema específico da continuação de cadeias.
Curious2learn
14
ou você usar melhor paste0 (...) o que equivale a colar (..., Set = "")
gkcn
31
Mas paste0ainda não existia quando escrevi a resposta há mais de 2 anos.
Dirk Eddelbuettel
Parece que a edição foi rejeitada e eu concordo mais ou menos com a rejeição. A resposta ainda está correta, tem seu contexto e os comentários a atualizam.
Dirk Eddelbuettel 19/09/2013
Obrigado por isso. Aprendi errado que você precisa usar uma vantagem para dividir as linhas longas. Fico feliz que a realidade seja muito mais simples!
Iain Samuel McLean Elder
144

Bah, os comentários são muito pequenos. De qualquer forma, o @Dirk está muito certo.

R não precisa ser informado de que o código começa na próxima linha. É mais inteligente que o Python ;-) e continuará a ler a próxima linha sempre que considerar a declaração como "não concluída". Na verdade, no seu caso, ele também foi para a próxima linha, mas R assume o retorno como um personagem quando é colocado entre "".

Lembre-se, você precisará garantir que seu código não esteja finalizado. Comparar

a <- 1 + 2
+ 3

com

a <- 1 + 2 +
3

Portanto, ao espalhar o código por várias linhas, você deve certificar-se de que R saiba que algo está por vir:

  • deixando um suporte aberto, ou
  • terminando a linha com um operador

Quando estamos falando de strings, isso ainda funciona, mas você precisa ter um pouco de cuidado. Você pode abrir as aspas e R continuará lendo até fechá-lo. Mas todos os caracteres, incluindo a nova linha, serão vistos como parte da string:

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.

Essa é a razão pela qual, neste caso, seu código não funcionou: um caminho não pode conter um caractere de nova linha ( \n). É também por isso que é melhor usar a solução paste()ou paste0()Dirk proposto.

Joris Meys
fonte
Obrigado Joris. Eu vi os exemplos semelhantes aos que você deu na documentação on-line e tentei isso também para a string. Eu pensei que, se não encontrar uma cotação de fechamento, continuará para a próxima linha. Mas com a string, ela não funciona, ou melhor, como você disse, funciona de maneira diferente no sentido de que assume como um novo caractere de linha.
Curious2learn
Obrigado por deixar claro por que às vezes você pode dividir linhas com um sinal de mais!
Iain Samuel McLean Elder
8
não, não é mais inteligente que o python aqui. ao invés de paste("~one",\n"/two")você apenas precisar ("~one" \n "/two"). solte as vírgulas e o paste. Não estou olhando a linguagem smackdown. Eu uso os dois idiomas, mas sempre o colar foi um incômodo.
Phil Cooper
2
@JorisMeys Certo, eu estava tentando corrigir essa distorção. Use parens e você não precisa do "\" para a continuação da linha. Gostei porque você também pode ter comentários em linhas que você não pode fazer com a sintaxe "\" (por exemplo, ("one"\n "/one.one" # some comment\n "/two")' exemplos em stackoverflow.com/questions/10660435/…
Phil Cooper
1
leaving a bracket open, or ending the line with an operatoresses dois são o caminho a percorrer.
SIslam
35

O método de Dirk acima funcionará absolutamente, mas se você estiver procurando uma maneira de inserir uma cadeia longa em que é importante preservar espaço em branco / estrutura (exemplo: uma consulta SQL usando RODBC), há uma solução em duas etapas.

1) Coloque a sequência de texto em várias linhas

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

2) R apresentará vários \ncaracteres. Retire aqueles strwrap()que destroem espaços em branco, de acordo com a documentação :

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

Ao dizer ao strwrap para agrupar seu texto em uma linha muito, muito longa, você obtém um vetor de caractere único, sem caracteres de espaço em branco / nova linha.

Andrew
fonte
3
Gosto mais desta resposta porque não preciso escrever tantas vírgulas como na pasta, se a sequência for bastante longa. 1
user3032689
3
Esteja ciente de que strwrappode retornar o vetor de várias seqüências de caracteres, mesmo que a sequência de origem não exceda 10k caracteres. Tente strwrap("a\n\nb"). Ele retornará um vetor de comprimento 3 e você precisará colá-lo novamente paste(strwrap("a\n\nb"), collapse=" ")usando uma cola de caractere de espaço para recolher o vetor.
Gedrox
18

Para esse caso específico, existe file.path:

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

Sei que este post é antigo, mas eu tinha uma situação como essa e só quero compartilhar minha solução. Todas as respostas acima funcionam bem. Mas se você possui um código como o da sintaxe de encadeamento data.table, torna-se um desafio. por exemplo, eu tive um problema como este.

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]

Tentei a maioria das sugestões acima e elas não funcionaram. mas descobri que eles podem ser divididos após a vírgula dentro []. Dividir ][não funciona.

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]
M Terry
fonte
Será que você confundiu a pergunta que estava tentando responder? Isso não tem nada a ver com a pergunta do OP.
zerweck
Tem sim. A questão principal é como dividir uma linha de código em várias linhas. Eu demonstrei isso usando outro exemplo que é um pouco mais complexo que a pergunta original. Eu pensei que era necessário publicá-lo porque gastei muito tempo tentando descobrir como dividir esse pedaço de código específico. E acho que ajuda alguém com um problema semelhante.
M Terry
O problema do OP era que dividir um vetor de caracteres com uma quebra de linha inclui a quebra de linha no vetor de caracteres. Sua resposta é específica apenas para a sintaxe
data.table
Como um exemplo de divisão de uma linha de código em várias linhas
M Terry