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.

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.


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.


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.


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)

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]

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.