Hi all Playing around with some branching using if, if else, and else, I wrote the following very basic script: [code block] ## Take single value input from user: # Note 'as.integer' to convert character vector to numeric for testing nums <- (as.numeric(readline("Please enter a number between 1 and 15: "))) ## Truth test routine: # Set conditional values and test input against conditions and then print outcome if ((nums > 15) || (nums < 1)) { ? print(c(nums, "is not between 1 or 15")) } else if ((nums > 5) && (nums < 10) || (nums == 12)) { ? print(c(nums, "falls within 6 - 9 inclusively, or is 12")) }? else { ? print( c(nums, "is *not* 6 - 9 inclusive, nor is it 12")) } [/ code block] However, it prints out like this: [output] Please enter a number between 1 and 15: 17 [1] "17"???????????????????? "is not between 1 or 15" Please enter a number between 1 and 15: 9 [1] "9" [2] "falls within 6 - 9 inclusively, or is 12" Please enter a number between 1 and 15: 13 [1] "13"???????????????????????????????????? "is *not* 6 - 9 inclusive, nor is it 12" [/ output] How do I: (a) reduce the gap between the reported number (i.e., 17, 9, 13) in each of the lines? and (b) ensure that in the case of the second run using 9 as the input, the print is not over two lines? I will try the switches function soon, which may yield a different output format, but wanted to get my head around why this is printing out the way it is. Many thanks for any help. Andrew [[alternative HTML version deleted]]
I often use sprintf() to control formatting of text strings. e.g. sprintf("%s is not between 1 or 15\n",nums) See ?sprintf for details HTH, Eric On Tue, Dec 18, 2018 at 10:56 AM Andrew <phaedrusv at gmail.com> wrote:> Hi all > > Playing around with some branching using if, if else, and else, I wrote > the following very basic script: > > > [code block] > > ## Take single value input from user: > # Note 'as.integer' to convert character vector to numeric for testing > > nums <- (as.numeric(readline("Please enter a number between 1 and 15: "))) > > ## Truth test routine: > # Set conditional values and test input against conditions and then > print outcome > > if ((nums > 15) || (nums < 1)) > { > print(c(nums, "is not between 1 or 15")) > } else if ((nums > 5) && (nums < 10) || (nums == 12)) > { > print(c(nums, "falls within 6 - 9 inclusively, or is 12")) > } else > { > print( c(nums, "is *not* 6 - 9 inclusive, nor is it 12")) > } > > [/ code block] > > > However, it prints out like this: > > [output] > > Please enter a number between 1 and 15: 17 > [1] "17" "is not between 1 or 15" > > Please enter a number between 1 and 15: 9 > [1] "9" > [2] "falls within 6 - 9 inclusively, or is 12" > > Please enter a number between 1 and 15: 13 > [1] "13" "is *not* 6 - 9 inclusive, > nor is it 12" > > [/ output] > > > How do I: > > (a) reduce the gap between the reported number (i.e., 17, 9, 13) in each > of the lines? and > > (b) ensure that in the case of the second run using 9 as the input, the > print is not over two lines? > > I will try the switches function soon, which may yield a different > output format, but wanted to get my head around why this is printing out > the way it is. > > Many thanks for any help. > > Andrew > > > [[alternative HTML version deleted]] > > ______________________________________________ > 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]]
On Tue, 18 Dec 2018 08:56:23 +0000 Andrew <phaedrusv at gmail.com> wrote:> How do I: > > (a) reduce the gap between the reported number (i.e., 17, 9, 13) in > each of the lines? and > > (b) ensure that in the case of the second run using 9 as the input, > the print is not over two lines?Build a single string from your string parts. ?sprintf has already been mentioned; another option is ?paste. To prevent strings from being printed in quotes, use ?message. -- Best regards, Ivan
Hello, Yet another option is ?cat. msg <- c("is not between 1 or 15", "is *not* 6 - 9 inclusive, nor is it 12", "falls within 6 - 9 inclusively, or is 12", "is *not* 6 - 9 inclusive, nor is it 12", "is not between 1 or 15") nums <- as.numeric(readline("Please enter a number between 1 and 15: ")) i <- if(nums == 12) 2 else findInterval(nums, c(-Inf, 1, 6, 9, 15), rightmost.closed = TRUE) cat(nums, msg[i], "\n") Hope this helps, Rui Barradas ?s 09:25 de 18/12/2018, Ivan Krylov escreveu:> On Tue, 18 Dec 2018 08:56:23 +0000 > Andrew <phaedrusv at gmail.com> wrote: > >> How do I: >> >> (a) reduce the gap between the reported number (i.e., 17, 9, 13) in >> each of the lines? and >> >> (b) ensure that in the case of the second run using 9 as the input, >> the print is not over two lines? > > Build a single string from your string parts. ?sprintf has already been > mentioned; another option is ?paste. > > To prevent strings from being printed in quotes, use ?message. >
Dear Eric, Ivan & Rui Thanks all for your suggestions. FWIW, I've opted to use paste0 and after a bit of playing around found it formatted the output nicely. Eric, I wasn't aware of sprintf - seems a handy function to format text with, so will try to remember that. Ivan, I'll dig into 'message' a little more, so that's a good one to know. Rui, I liked the idea of the output vector and indexing - that will be useful for longer/ more complicated branching Thank you all again. Best wishes Andrew On 18/12/2018 09:25, Ivan Krylov wrote:> On Tue, 18 Dec 2018 08:56:23 +0000 > Andrew <phaedrusv at gmail.com> wrote: > >> How do I: >> >> (a) reduce the gap between the reported number (i.e., 17, 9, 13) in >> each of the lines? and >> >> (b) ensure that in the case of the second run using 9 as the input, >> the print is not over two lines? > Build a single string from your string parts. ?sprintf has already been > mentioned; another option is ?paste. > > To prevent strings from being printed in quotes, use ?message. >