[Rd] sys.call() inside replacement functions incorrectly returns *tmp*

Duncan Murdoch
Mon, 15 Oct 2018 16:01:59 -0000

On 14/10/2018 8:19 PM, Abs Spurdle wrote:
> Kia Ora
>
> Let's say we have:
> "myreplacementfunction<-" = function (..., value)
> {	call = sys.call ()
> 	print (as.list (call) )
> 	0
> }
>
> Then we call:
> x = 0
> myreplacementfunction (x, y, z) = 0
>
> It will return:
> [[1]]
> `myreplacementfunction<-`
>
> [[2]]
> `*tmp*`
>
> [[3]]
> y
>
> [[4]]
> z
>
> $value
> <promise: 0x06fb6968>
>
> There's two problems here.
> Firstly, x has to be defined otherwise we get an error message.
> Secondly, the first argument is returned as *tmp*.
>
> Both are incorrect.

Both of these are documented (by example) in the R Language Definition
manual, section 3.4.4:

"Assignment to subsets of a structure is a special case of a general
mechanism for complex assignment:

x[3:5] <- 13:15
The result of this command is as if the following had been executed

`*tmp*` <- x
x <- "[<-"(`*tmp*`, 3:5, value=13:15)
rm(`*tmp*`)"

Duncan Murdoch

>
> It should be possible to call the function without defining x.
> And it should return x rather than *tmp*.
> In other words, replacement function calls should be the same as other
> function calls.
>
> Although it gets y and z right.
>
>
> kind regards
> Abs
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>