John, Thanks for the pointers.
The DummyFunc is just a made-up example. The true function I need to use is more complicated and would be distractive to include. Do you mean that sapply would take columns in the input data.frame and feed them into "FUN" as "whole" vectors? That explains the behavior. Is there an "*apply" function that will fee elements of the input data.frame into "FUN" instead of whole columns? Thanks. ________________________________ From: John Fox <j...@mcmaster.ca> To: 'Alex Zhang' <alex.zh...@ymail.com> Cc: r-help@r-project.org Sent: Tuesday, December 27, 2011 3:10 PM Subject: RE: [R] sapply Call Returning " the condition has length > 1" Error Dear Alex, > -----Original Message----- > From: r-help-boun...@r-project.org [mailto:r-help-bounces@r- > project.org] On Behalf Of Alex Zhang > Sent: December-27-11 2:14 PM > To: r-help@r-project.org > Subject: [R] sapply Call Returning " the condition has length > 1" > Error > > 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. This is a warning, not really an error message. A data frame is essentially a list of variables (columns), and sapply() applies its FUN argument to each list element, that is, each variable -- the one variable val in your case. That produces a warning because val > 0 is a vector of 11 elements, and the first comparison, 3 > 0, which is TRUE, controls the result. > > 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. Well, you could just use > abs(Y$val) [1] 3 2 1 0 1 2 3 4 5 6 7 but I suppose that you didn't really want to write your own version of the absolute-value function as something more than an exercise. An alternative is > with(Y, ifelse(val > 0, val, -val)) [1] 3 2 1 0 1 2 3 4 5 6 7 I hope this helps, John -------------------------------- John Fox Senator William McMaster Professor of Social Statistics Department of Sociology McMaster University Hamilton, Ontario, Canada http://socserv.mcmaster.ca/jfox > > - Alex > [[alternative HTML version deleted]] [[alternative HTML version deleted]]
______________________________________________ R-help@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.