The first solution with diff works for uniform abscissa only with integer values.
z <- seq(0, 10, length=100) all(diff(z) == z[2] - z[1] ) ## FALSE In this case, as you recommended, I could use signif or round or a tolerance for real numbers. In my particular case, in order to set a tolerance, I need the scale used and I don't have this information. I prefer to test the "near uniformity". I didn't know the function zapsmall. It could be useful! Thanks Sarah and Bert!!! Marc 2015-04-06 19:51 GMT+02:00 Bert Gunter <gunter.ber...@gene.com>: > ... correction: you need to use absolute value for the comparison, of > course. > > all(abs(diff(z) - z[2] + z[1]) < tol) > > -- Bert > > Bert Gunter > Genentech Nonclinical Biostatistics > (650) 467-7374 > > "Data is not information. Information is not knowledge. And knowledge > is certainly not wisdom." > Clifford Stoll > > > > > On Mon, Apr 6, 2015 at 10:47 AM, Bert Gunter <bgun...@gene.com> wrote: > > Perhaps ?diff might be useful here: > > > > z <- runif(20) > > all(diff(z) == z[2] - z[1] ) > > ## FALSE > > > > z <- seq_len(10) > > all(diff(z) == z[2] - z[1] ) > > ##TRUE > > > > You can use signif or round as before to allow for "near uniformity" > > or use ?zapsmall or an explicit comparison with a tolerancec instead > > of ==, e.g. all(diff(z) - z[2] + z[1] < tol) > > > > Cheers, > > Bert > > > > Bert Gunter > > Genentech Nonclinical Biostatistics > > (650) 467-7374 > > > > "Data is not information. Information is not knowledge. And knowledge > > is certainly not wisdom." > > Clifford Stoll > > > > > > > > > > On Mon, Apr 6, 2015 at 10:11 AM, Marc Lamblin <marcgg.lamb...@gmail.com> > wrote: > >> The aim is to control if a given abscissa/grid is uniform or not. > Abscissa > >> in generic vector of real ordered numbers. > >> > >> Here a reproducibile code: > >> > >> # uniform abscissa/grid > >> abscissa1 <- seq(0, 1, length=100) > >> # non-uniform abscissa/grid > >> abscissa2 <- sort(runif(100)) > >> > >> control1 <- all(signif(abscissa1[1:(length(abscissa1) - 1) + 1] - > >> abscissa1[1:(length(abscissa1) - 1)]) == > signif(rep((range(abscissa1)[2] - > >> range(abscissa1)[1])/(length(abscissa1) - 1), length(abscissa1) - 1))) > >> control2 <- all(signif(abscissa2[1:(length(abscissa2) - 1) + 1] - > >> abscissa2[1:(length(abscissa2) - 1)]) == > signif(rep((range(abscissa2)[2] - > >> range(abscissa2)[1])/(length(abscissa2) - 1), length(abscissa2) - 1))) > >> > >> control1 > >> control2 > >> > >> As expected control1 is TRUE and control2 is FALSE. Actually in this > code > >> it is possible also to use > >> diff inside signif. > >> Do you mean that the control to perform can be done in this manner > >> > >> if (length(unique(diff(vec))) == 1) { > >> control <- TRUE > >> } else { > >> control <- FALSE > >> } > >> > >> I have tried to apply this control on abscissa1 which is uniform but > >> length(unique(diff(abscissa1))) was greater than one; probably, as you > >> said, this is due to the fact that in this way I don't take into account > >> the machine precision. > >> What I want to understand is if there is a SAFE solution, even if until > now > >> this control is working correctly. I have seen in the documentation of > >> signif that by default the number of digits considered are 6. The > number of > >> digits to consider depends on the scale used. It doesn't make sense to > >> increase the number of digits with respect to default because, in this > >> case, you are not using an handy scale. > >> Maybe it could be better directly to ask user if the abscissa passed as > >> argument is uniform or not. > >> Thanks a lot for the link!!! > >> > >> Marc > >> > >> > >> > >> > >> 2015-04-06 16:32 GMT+02:00 Sarah Goslee <sarah.gos...@gmail.com>: > >> > >>> Without a reproducible example that includes some sample data (fake is > >>> fine), the code you used (NOT in HTML format), and some clear idea of > >>> what output you expect, it's impossible to figure out how to help you. > >>> Here are some suggestions for creating a good reproducible example: > >>> > >>> > http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example > >>> > >>> Without knowing what you want, it looks like abscissa is a vector, and > >>> so I'm not sure how this defines a grid, but > >>> length(unique(diff(vec))) > >>> might help. Note that this DOES NOT account for machine precision in > any > >>> way. > >>> > >>> Sarah > >>> > >>> On Mon, Apr 6, 2015 at 7:50 AM, Marc Lamblin <marcgg.lamb...@gmail.com > > > >>> wrote: > >>> > I need to control of a given grid is uniform. This control using > signif > >>> > until now works: > >>> > > >>> > if (all(signif(abscissa[1:(length(abscissa) - 1) + 1] - > >>> > abscissa[1:(length(abscissa) - 1)]) == > signif(rep((range(abscissa)[2] - > >>> > range(abscissa)[1])/(length(abscissa) - 1), > length(abscissa) - > >>> > 1)))) { > >>> > # other stuff > >>> > } > >>> > > >>> > Does someone have some suggestions to improve this control? Thanks in > >>> > advance!! :) > >>> > > >>> > Marc > >>> > > >>> > [[alternative HTML version deleted]] > >>> > > >>> > >>> > >>> -- > >>> Sarah Goslee > >>> http://www.functionaldiversity.org > >>> > >> > >> [[alternative HTML version deleted]] > >> > >> ______________________________________________ > >> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > >> 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. > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.