William Michels
2021-Jun-05 18:04 UTC
[R] Beginner problem - using mod function to print odd numbers
> i <- 1L; span <- 1:100; result <- NA; > for (i in span){+ ifelse(i %% 2 != 0, result[i] <- TRUE, result[i] <- FALSE) + }> span[result][1] 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 [30] 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99>HTH, Bill. W. Michels, Ph.D. On Sat, Jun 5, 2021 at 12:55 AM Stefan Evert <stefanML at collocations.de> wrote:> > > > > I don't understand. -- > > > > 7%%2=1 > > 9%%2=1 > > 11%%2=1 > > > > What aren't these numbers printing ? > > > > num<-0 > > for (i in 1:100){ > > num<-num+i > > if (num%%2 != 0) > > print(num) > > } > > Your code tests the numbers > > 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, ? > > and correctly prints the odd ones among them. > > But I suppose that's not what you wanted to do? > > ______________________________________________ > R-help at 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.
Bert Gunter
2021-Jun-05 19:26 UTC
[R] Beginner problem - using mod function to print odd numbers
I'm sorry, but this is a good example of how one should *not* do this in R. I also should apologize for any pedantry that follows, but I believe this serves as a nice example of the ideas. Two of R's central features as a "data science" language are that many of its core capabilities are "vectorized" -- can calculate on whole objects (at the user-visible interpreter level) rather than requiring explicit loops; and that it can use object indexing in several different modalities, here logical indexing, for extraction and replacement in whole objects such as vectors and matrices. Not only does this typically yield simpler, more readable code (admittedly, a subjective judgment), but it is also typically much faster, though I grant you that this can often be overrated. In this instance, the several lines of looping code you presented can be condensed into a single line:> span <- 1:20 > span[span %% 2 == 1][1] 1 3 5 7 9 11 13 15 17 19 ### Trickier, but perhaps instructive, is: ###> span[TRUE & span %% 2][1] 1 3 5 7 9 11 13 15 17 19 All languages trade off various strengths and weaknesses, but I think it's fair to say that one should try to work within the paradigms that are the language's strengths when possible, R's vectorization and indexing in this example. Cheers, Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Sat, Jun 5, 2021 at 11:05 AM William Michels via R-help < r-help at r-project.org> wrote:> > i <- 1L; span <- 1:100; result <- NA; > > for (i in span){ > + ifelse(i %% 2 != 0, result[i] <- TRUE, result[i] <- FALSE) > + } > > span[result] > [1] 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 > 45 47 49 51 53 55 57 > [30] 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 > > > > HTH, Bill. > > W. Michels, Ph.D. > > > On Sat, Jun 5, 2021 at 12:55 AM Stefan Evert <stefanML at collocations.de> > wrote: > > > > > > > > I don't understand. -- > > > > > > 7%%2=1 > > > 9%%2=1 > > > 11%%2=1 > > > > > > What aren't these numbers printing ? > > > > > > num<-0 > > > for (i in 1:100){ > > > num<-num+i > > > if (num%%2 != 0) > > > print(num) > > > } > > > > Your code tests the numbers > > > > 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, ? > > > > and correctly prints the odd ones among them. > > > > But I suppose that's not what you wanted to do? > > > > ______________________________________________ > > R-help at 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. > > ______________________________________________ > R-help at 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]]
David Carlson
2021-Jun-06 19:21 UTC
[R] Beginner problem - using mod function to print odd numbers
There is really no need for a loop: num <- 1:100 num[ifelse(num %% 2 == 1, TRUE, FALSE)] [1] 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 [26] 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 David L Carlson On Sat, Jun 5, 2021 at 2:05 PM William Michels via R-help <r-help at r-project.org> wrote:> > > i <- 1L; span <- 1:100; result <- NA; > > for (i in span){ > + ifelse(i %% 2 != 0, result[i] <- TRUE, result[i] <- FALSE) > + } > > span[result] > [1] 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 > 45 47 49 51 53 55 57 > [30] 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 > > > > HTH, Bill. > > W. Michels, Ph.D. > > > On Sat, Jun 5, 2021 at 12:55 AM Stefan Evert <stefanML at collocations.de> wrote: > > > > > > > > I don't understand. -- > > > > > > 7%%2=1 > > > 9%%2=1 > > > 11%%2=1 > > > > > > What aren't these numbers printing ? > > > > > > num<-0 > > > for (i in 1:100){ > > > num<-num+i > > > if (num%%2 != 0) > > > print(num) > > > } > > > > Your code tests the numbers > > > > 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, ? > > > > and correctly prints the odd ones among them. > > > > But I suppose that's not what you wanted to do? > > > > ______________________________________________ > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help__;!!KwNVnqRv!Qe700OYnXI-Qe4XYE55MkVqMX3g4Ic4YFx87U-moxnT0xKw7m-rbNqU-EZd5ixk$ > > PLEASE do read the posting guide https://urldefense.com/v3/__http://www.R-project.org/posting-guide.html__;!!KwNVnqRv!Qe700OYnXI-Qe4XYE55MkVqMX3g4Ic4YFx87U-moxnT0xKw7m-rbNqU-fWVQ0xI$ > > and provide commented, minimal, self-contained, reproducible code. > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help__;!!KwNVnqRv!Qe700OYnXI-Qe4XYE55MkVqMX3g4Ic4YFx87U-moxnT0xKw7m-rbNqU-EZd5ixk$ > PLEASE do read the posting guide https://urldefense.com/v3/__http://www.R-project.org/posting-guide.html__;!!KwNVnqRv!Qe700OYnXI-Qe4XYE55MkVqMX3g4Ic4YFx87U-moxnT0xKw7m-rbNqU-fWVQ0xI$ > and provide commented, minimal, self-contained, reproducible code.