Skip to content

Evaluating args in a function

4 messages · Sandy Weisberg, Gabor Grothendieck, Duncan Murdoch +1 more

#
Can anyone explain what I'm doing wrong here:

 > fred <- data.frame()
 > class(fred)
[1] "data.frame"
 > test.fn <- function(x,class=class(x)) {class}
 > test.fn(fred)
Error in test.fn(fred) : promise already under evaluation: recursive 
default argument reference or earlier problems?

R 2.5.1 on both Windows and SUSE Linux.
#
You have a recursive reference.  Try using a different name other than
class.  For example, in the following we use class. with a dot at the end
(so that abbreviation of it still allows the user to write class):

fred <- data.frame()
test.fn <- function(x,class.=class(x)) {class.}
test.fn(fred) # "data.frame"
test.fn(fred, class = "x") # "x"
On 9/12/07, Sandy Weisberg <sandy at stat.umn.edu> wrote:
#
On 9/12/2007 12:48 PM, Sandy Weisberg wrote:
As Gabor said, this is a recursive reference.  In order to know whather 
your default value class(x) should evaluate using the local variable 
named class or should go back to the base package, R needs to evaluate 
it. And there's the loop.

Another solution besides Gabor's suggestion of renaming the argument is 
to be explicit that you want the base class() function, e.g.

 > test.fn <- function(x,class=base::class(x)) {class}
 > fred <- data.frame()
 > test.fn(fred)
[1] "data.frame"

Duncan Murdoch
#
Gabor Grothendieck wrote:
One year using R, and I hadn't known that I could abbreviate
function arguments... Thanks for the (accidental) help :-)

Alberto Monteiro