Martin
> On Wed, Oct 12, 2016 at 12:31 PM, Henrik Bengtsson
> <henrik.bengts...@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.mich...@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 <micha...@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.bengts...@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@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