[Rd] Inefficiency in df$col

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Mon Feb 4 15:32:11 CET 2019


On 04/02/2019 9:20 a.m., Radford Neal wrote:
>>> I think you might want to just delete the definition of $.data.frame,
>>> reverting to the situation before R-3.1.0.
>>
>> I imagine the cause is that the list version is done in C code rather
>> than R code (i.e. there's no R function `$.list`).  So an alternative
>> solution would be to also implement `$.data.frame` in the underlying C
>> code.  This won't be quite as fast (it needs that test for NULL), but
>> should be close in the full match case.
> 
> I maybe wasn't completely clear.  The $ operator for data frames was
> previously done in C - since it was done by the same primitive as for
> lists.  In R-3.1.0, this was changed - producing a massive slowdown -
> for the purpose of giving a warning on partial matches even if the
> user had not set the warnPartialMatchDollar option to TRUE.  In
> R-3.1.1, this was changed to not warn unless warnPartialMatchDollar was
> TRUE which was the PREVIOUS behaviour.  In other words, this change
> reverted the change made in R-3.1.0.  But instead of simply deleting
> the definition of $.data.frame, R-3.1.1 added extra code to it, the
> only effect of which is to slightly change the wording of the warning
> message from what is produced for any other list, while still retaining
> the massive slowdown.
> 
> There is no need for you to write $.data.frame in C.  You just need
> to delete the version written in R.

Sorry, I did misunderstand.  Thanks for the clarification.

But if the "You" in your last sentence meant me, it needs to be "They": 
I am not a member of R Core and can't make any changes to the sources.

Duncan Murdoch



More information about the R-devel mailing list