K Owen
K Owen

Reputation: 1250

Anonymous function in R

Using a dataset w, which includes a numeric column PY, I can do:

nrow(subset(w, PY==50))

and get the correct answer. If, however, I try to create a function:

fxn <- function(dataset, fac, lev){nrow(subset(dataset, fac==lev))}

and run

fxn(w, PY, 50)

I get the following error:

Error in eval(expr, envir, enclos) : object 'PY' not found

What am I doing wrong? Thanks.

Upvotes: 2

Views: 6207

Answers (1)

flodel
flodel

Reputation: 89057

From the documentation of subset:

Warning This is a convenience function intended for use interactively. For programming it is better to use the standard subsetting functions like [, and in particular the non-standard evaluation of argument subset can have unanticipated consequences.

This rather obscure warning was very well explained here: Why is `[` better than `subset`?

The final word is you can't use subset other than interactively, in particular, not via a wrapper like you are trying. You should use [ instead:

fxn <- function(dataset, fac, lev) nrow(dataset[dataset[fac] == lev, , drop = FALSE])

or rather simply:

fxn <- function(dataset, fac, lev) sum(dataset[fac] == lev)

Upvotes: 5

Related Questions