[Rd] How to assign NULL value to pairlist element while keeping it a pairlist?

Michael Lawrence lawrence.michael at gene.com
Thu Oct 13 00:21:13 CEST 2016


Thanks, this was what I expected. There is a desire to eliminate the
usage of pairlist from user code, which suggests the alternative of
allowing for function arguments to be stored in lists. That's a much
deeper change though.

On Wed, Oct 12, 2016 at 12:31 PM, Henrik Bengtsson
<henrik.bengtsson at gmail.com> wrote:
> Michael, thanks for this info.
>
> I've stumbled upon this in a case where I walk an R expression (the
> AST) and (optionally) modifies it (part of the globals package).  In R
> expressions, a function definition uses a pairlist to represent the
> arguments.  For example,
>
>> expr <- quote(function(x = 1) x)
>> str(as.list(expr))
> List of 4
>  $ : symbol function
>  $ :Dotted pair list of 1
>   ..$ x: num 1
>  $ : symbol x
>  $ :Class 'srcref'  atomic [1:8] 1 15 1 29 15 29 1 1
> .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile'
> <environment: 0x13918b8>
>
> Here the 2nd element is a pairlist:
>
>> str(expr[[2]])
> Dotted pair list of 1
>  $ x: num 1
>> typeof(expr[[2]])
> [1] "pairlist"
>
> Now say that I want to update the default value of argument 'x', which
> is currently 1, to NULL.  Then I do:
>
>> expr[[2]][1] <- list(x = NULL)
>
> At this step, I end up with an expression 'expr' where the arguments
> are no longer represented by a pairlist:
>
>> str(expr[[2]])
> List of 1
>  $ x: NULL
>> typeof(expr[[2]])
> [1] "list"
>
> More importantly, at this point 'expr' no longer holds a valid R expression:
>
>> expr
> Error: badly formed function expression
>
> The solution is to make sure we have a pairlist:
>
>> expr[[2]] <- as.pairlist(expr[[2]])
>> expr
> function(x = NULL) x
>
>
> I agree it would be nice to fix this for consistency, but if you bump
> into major issues, at least I can live with having to use an explicit
> as.pairlist().
>
> Thanks
>
> Henrik
>
> On Wed, Oct 12, 2016 at 10:53 AM, Michael Lawrence
> <lawrence.michael at gene.com> wrote:
>> Hi Henrik,
>>
>> It would help to understand your use case for pairlists.
>>
>> Thanks,
>> Michael
>>
>> On Wed, Oct 12, 2016 at 9:40 AM, Michael Lawrence <michafla at gene.com> wrote:
>>> The coercion is probably the most viable workaround for now, as it's
>>> consistent with what happens internally for calls. All pairlists/calls
>>> are converted to list for subassignment, but only calls are converted
>>> back. My guess is that the intent was for users to move from using a
>>> pairlist to the "new" (almost 20 years ago) list. In my opinion,
>>> consistency trumps "convenience" in this case. If others agree, I'll
>>> change it to also coerce back to pairlist.
>>>
>>> Michael
>>>
>>> On Wed, Oct 12, 2016 at 9:20 AM, Henrik Bengtsson
>>> <henrik.bengtsson at gmail.com> wrote:
>>>> Hi, I seem to not be able to assign NULL to an element of a pairlist
>>>> without causing it to be coerced to a plain list.  For example:
>>>>
>>>>> x <- pairlist(1, 2)
>>>>> class(x)
>>>> [1] "pairlist"
>>>>
>>>>> x[1] <- list(NULL)
>>>>> class(x)
>>>> [1] "list"
>>>>
>>>> This actually true for all [()<- assignments regardless of list value, e.g.
>>>>
>>>>> x <- pairlist(1, 2)
>>>>> x[1] <- list(0)
>>>> [1] "list"
>>>>
>>>> I also tried assigning a pairlist(), but still the same problem:
>>>>
>>>>> x <- pairlist(1, 2)
>>>>> x[1] <- pairlist(0)
>>>> [1] "list"
>>>>
>>>> The only workaround I'm aware of is to:
>>>>
>>>> x <- as.pairlist(x)
>>>>
>>>> at the end.  Any other suggestions?
>>>>
>>>> Thanks,
>>>>
>>>> Henrik
>>>>
>>>> ______________________________________________
>>>> R-devel at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list