Have we talked this topic out yet?

As has been mentioned, R allows many strategies with perhaps the simplest being 
to use the paste functions. Here, is a not simpler version where you do a 
global substitution that removes it alongside the artificial newlines.

gsub(pattern="\n",
     replacement="",
     x="Hello
And
Goodbye")

Result:
[1] "HelloAndGoodbye"

Is it worth the bother? I think not . It does work but I suspect gsub (or 
similar functions) that do a lot more, may be as inefficient or even more than 
the paste0 alternative.



-----Original Message-----
From: R-devel <r-devel-boun...@r-project.org> On Behalf Of Simon Urbanek
Sent: Monday, June 2, 2025 7:48 PM
To: Henrik Bengtsson <henrik.bengts...@gmail.com>
Cc: r-devel@r-project.org
Subject: Re: [Rd] Specifying a long string literal across several lines



> On 3 Jun 2025, at 09:34, Henrik Bengtsson <henrik.bengts...@gmail.com> wrote:
> 
> One could also argue that paste0("a", "b", "c") is a function call that needs 
> to be evaluated at runtime, whereas "abc" is a string constant understood by 
> the parser, and often also language agnostic. I'd assume compilers and code- 
> and text-search tools do a better job with the latter.
> 


Well, about that, just to illustrate how insane that is:

$ cat foo.py 
if True:
    a = "foo\
    bar\
    !"
    print(a)
$ python3 foo.py
foo    bar    !

in particular for a language that insist on the space being part of the syntax 
;) - so it forces you to indent things and yet it breaks badly in those strings.

I don’t have a strong opinion, but I agree that it is very bad for readability 
so definitely not something that should be recommended.

That said, in R we tend to offer many tools that allow you to shoot yourself in 
the foot, so some might argue that one more is not going to hurt ;) - not 
everyone wants their code to be readable…

Cheers,
Simon


> 
> 
> On Mon, Jun 2, 2025 at 2:18 PM Josiah Parry <josiah.pa...@gmail.com> wrote:
>> 
>> I suppose taste is learned as well. It does feel quite odd that the best
>> way to define a long string without a note or text wrapping is by being
>> creative with functions.
>> 
>> This is valid in Python, Julia, and Rust (if you add `let` and a
>> terminating semi-colon):
>> 
>> my_str = "part1\
>> part2\
>> part2"
>> 
>> I don't think it is abnormal to expect or desire this type of functionality
>> in our favorite language.
>> 
>> On Mon, Jun 2, 2025 at 13:59 Kasper Daniel Hansen <
>> kasperdanielhan...@gmail.com> wrote:
>> 
>>> Like Tomas, I find the paste0 readability to be **much** better, partly
>>> because it allows for better indentation (as Tomas pointed out). Perhaps a
>>> pointless email, but sometimes - for these subjective issues - it is
>>> worthwhile to point out a difference in opinion.
>>> 
>>> Best,
>>> Kasper
>>> 
>>> On Mon, Jun 2, 2025 at 12:27 PM Tomas Kalibera <tomas.kalib...@gmail.com>
>>> wrote:
>>> 
>>>> 
>>>> On 6/2/25 17:37, Josiah Parry wrote:
>>>>> Tomas,
>>>>> 
>>>>> Here is a good example of where this functionality would be useful:
>>>>> 
>>>> https://github.com/R-ArcGIS/arcgislayers/blob/2b29f4c254e7e5a1dadce8d4b0015a70dfae39d4/R/arc-open.R#L19-L56
>>>>> 
>>>>> In order to prevent R CMD check notes I have to use `paste0()` to
>>>>> concatenate long URLs. If we were able to use `\` to
>>>>> separate the string across multiple lines, it would make the solution
>>>>> much nicer!
>>>> 
>>>> It may be a matter of taste. To me the current form
>>>> 
>>>> #' furl <- paste0(
>>>> #' "https://services3.arcgis.com/ZvidGQkLaDJxRSJ2/arcgis/rest/services/";,
>>>> #'   "PLACES_LocalData_for_BetterHealth/FeatureServer/0"
>>>> #' )
>>>> #'
>>>> 
>>>> would be actually clearer than say this:
>>>> 
>>>> #' # FeatureLayer
>>>> #' furl <-
>>>> "https://services3.arcgis.com/ZvidGQkLaDJxRSJ2/arcgis/rest/services/\
>>>> PLACES_LocalData_for_BetterHealth/FeatureServer/0
>>>> <https://services3.arcgis.com/ZvidGQkLaDJxRSJ2/arcgis/rest/services/%5CPLACES_LocalData_for_BetterHealth/FeatureServer/0>
>>>> "
>>>> #'
>>>> 
>>>> Inside a per-line comment (#), a backslash followed by a newline would
>>>> probably be disallowed, anyway - e.g. in C it is considered dangerous
>>>> and is discouraged. And the code resulting from splices is hard to read
>>>> due to missing indentation. There is also risk of accidentally putting a
>>>> space after the backslash before the end of line (which some
>>>> languages/parsers then don't treat as a splice, some do, some issue a
>>>> warning - of course it is hard to see in the code).
>>>> 
>>>> The idea of automatically concatenating consecutive string literals as
>>>> in C would not easily work in R. This is now valid R code:
>>>> 
>>>> x <- "part1"
>>>> "part2"
>>>> 
>>>> if we introduced concatenation, we would change behavior of this code
>>>> (the value of x would be different, the result of these two lines would
>>>> be different).
>>>> 
>>>> I think paste0() is not that bad in the end.
>>>> 
>>>> Best
>>>> Tomas
>>>> 
>>>>> On Mon, Jun 2, 2025 at 3:19 AM Tomas Kalibera
>>>>> <tomas.kalib...@gmail.com> wrote:
>>>>> 
>>>>> 
>>>>>    On 5/28/25 04:15, Pavel Krivitsky via R-devel wrote:
>>>>>> Dear All,
>>>>>> 
>>>>>> Perhaps this should go in r-package-devel, but I suspect that
>>>>>    this is
>>>>>> going to turn into a feature request, and I want to run it by
>>>>>    the list
>>>>>> before filing it in the Bugzilla.
>>>>>> 
>>>>>> I would like to specify a long string literal without making the
>>>>>    line
>>>>>> of code too long. In R,
>>>>>> 
>>>>>> "abc
>>>>>> def"
>>>>>> 
>>>>>> yields the string "abc\def", and, as far as I can tell, there is
>>>> no
>>>>>> mechanism for preventing it from inserting a newline into the
>>>>>    string.
>>>>>> 
>>>>>> Putting a backslash before the newline, i.e.,
>>>>>> 
>>>>>> "abc\
>>>>>> def"
>>>>>> 
>>>>>> eliminates the newline in (that I know of) C/C++, Python, and
>>>> Julia,
>>>>>> but it makes no difference in R.
>>>>>> 
>>>>>> The implicit concatenation of Python and C/C++, e.g., "abc"
>>>>>    "def", is a
>>>>>> syntax error as well in R.
>>>>>> 
>>>>>> It is, of course, possible to use paste0(), but is there a more
>>>>>    concise
>>>>>> built-in mechanism in R of which I am not aware?
>>>>>> 
>>>>>> If not, I think it would make sense to bring R in line with the
>>>>>    others.
>>>>>> Currently, backslash and no backslash before a newline behave
>>>>>> identically (at least as far as I can tell), so I doubt that a
>>>>>> nontrivial amount of code relies on the current behaviour. [1]
>>>>> 
>>>>>    What would be real example of a long string literal you would want
>>>> to
>>>>>    enter this way?
>>>>> 
>>>>>    For entering a long text with newlines, one can use raw strings in R
>>>>>    (see ?Quotes) - but there you would see the newlines and
>>>> indentation.
>>>>>    I've seen code where  "paste0" has been aliased to a local function
>>>>>    named with a single letter to make concatenation more concise.
>>>>> 
>>>>>    Best
>>>>>    Tomas
>>>>> 
>>>>>> 
>>>>>>                              Any thoughts?
>>>>>>                              Pavel
>>>>>> 
>>>>>> [1] On the off chance that it does, it should easy to check by
>>>>>> searching for "\\\n" in package sources, because a backslash
>>>>>    before a
>>>>>> newline is a syntax error outside a string.
>>>>>> ______________________________________________
>>>>>> R-devel@r-project.org mailing list
>>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>> 
>>>>>    ______________________________________________
>>>>>    R-devel@r-project.org mailing list
>>>>>    https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>> 
>>>> 
>>>> ______________________________________________
>>>> R-devel@r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>> 
>>> 
>>> 
>>> --
>>> Best,
>>> Kasper
>>> 
>> 
>>        [[alternative HTML version deleted]]
>> 
>> ______________________________________________
>> R-devel@r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to