[R] sapply Call Returning " the condition has length > 1" Error

R. Michael Weylandt michael.weylandt at gmail.com
Tue Dec 27 21:04:49 CET 2011


You are right that the problem is that "DummyFunc" isn't vectorized. R
looks for a single logical value in an "if" statement but "x>0" gives
it a whole vector's worth -- as the warning indicates, it only uses
the first and pushes the whole vector through the loop in the
return(-x) branch, which explains the values you saw. The correct way
to do it would be something like:

ifelse(x < 0, -x, x)

If, as you suggest, you can't modify the function (for whatever
reason), you can use the higher-order-function Vectorize() as follows:

vDummyFunc <- Vectorize(DummyFunc)
vDummyFunc(-3:7)

This isn't real vectorization, but it hides some *apply family stuff nicely.

Note that this doesn't act as you might expect on Y since data.frames
are taken column wise by default (you'll get the same problem).

Michael

On Tue, Dec 27, 2011 at 1:14 PM, Alex Zhang <alex.zhang at ymail.com> wrote:
> Dear all,
>
> Happy new year!
>
> I have a question re using sapply. Below is a dummy example that would replicate the error I saw.
>
> ##Code Starts here
> DummyFunc <- function(x) {
>
> if (x > 0) {
> return (x)
> } else
> {
> return (-x)
> }
>
> }
>
> Y = data.frame(val = c(-3:7))
> sapply(Y, FUN = DummyFunc)
> ##Code ends here
>
> When I run it, I got:
>      val
>  [1,]   3
>  [2,]   2
>  [3,]   1
>  [4,]   0
>  [5,]  -1
>  [6,]  -2
>  [7,]  -3
>  [8,]  -4
>  [9,]  -5
> [10,]  -6
> [11,]  -7
> Warning message:
> In if (x > 0) { :
>   the condition has length > 1 and only the first element will be used
>
> The result is different from what I would expect plus there is such an error message.
>
> I guess if the DummyFunc I provided is compatible with vectors, the problem would go away. But let's suppose I cannot change DummyFunc. Is there still a way to use sapply or alike without actually writing a loop? Thanks.
>
> - Alex
>        [[alternative HTML version deleted]]
>
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list