Jan Kacaba
2016-Oct-01 15:44 UTC
[R] strange output of cat function used in recursive function
Hello Dear R-help I tried to understand how recursive programming works in R. Bellow is simple recursive function. binary1 <- function(n) { if(n > 1) { binary(as.integer(n/2)) } cat(n %% 2) } When I call binary1(10) I get 1010. I believe that cat function stores value to a buffer appending values as recursion proceeds and at the end it prints the buffer. Am I right? I tried to modify the function to get some understanding: binary2 <- function(n) { if(n > 1) { binary2(as.integer(n/2)) } cat(n %% 2, sep=",") } With call binary2(10) I get also 1010. Why the output is not separated by commas? If I use in binary2 function cat(n %% 2, ",") on last line, the output is separated. Outside recursive function the cat function prints separated output in both cases e.g. cat(c(1:10), sep=",") and cat(c(1:10), ",") Derek
David Winsemius
2016-Oct-01 16:02 UTC
[R] strange output of cat function used in recursive function
> On Oct 1, 2016, at 8:44 AM, Jan Kacaba <jan.kacaba at gmail.com> wrote: > > Hello Dear R-help > > I tried to understand how recursive programming works in R. Bellow is > simple recursive function. > > binary1 <- function(n) { > if(n > 1) { > binary(as.integer(n/2)) > } > cat(n %% 2) > }Did you mean to type "binary1(as.integer(n)"?> When I call binary1(10) I get 1010. I believe that cat function stores > value to a buffer appending values as recursion proceeds and at the > end it prints the buffer. Am I right?No. Read the ?cat help page. It returns NULL. The material you see at the console is a side-effect.> > I tried to modify the function to get some understanding: > > binary2 <- function(n) { > if(n > 1) { > binary2(as.integer(n/2)) > } > cat(n %% 2, sep=",") > } > > With call binary2(10) I get also 1010. Why the output is not separated > by commas?I think because there is nothing to separate when it prints (since there was no "buffer".> > If I use in binary2 function cat(n %% 2, ",") on last line, the output > is separated. Outside recursive function the cat function prints > separated output in both cases e.g. cat(c(1:10), sep=",") and > cat(c(1:10), ",") > > Derek > > ______________________________________________ > 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.David Winsemius Alameda, CA, USA
Jan Kacaba
2016-Oct-01 16:29 UTC
[R] strange output of cat function used in recursive function
2016-10-01 18:02 GMT+02:00 David Winsemius <dwinsemius at comcast.net>:> >> On Oct 1, 2016, at 8:44 AM, Jan Kacaba <jan.kacaba at gmail.com> wrote: >> >> Hello Dear R-help >> >> I tried to understand how recursive programming works in R. Bellow is >> simple recursive function. >> >> binary1 <- function(n) { >> if(n > 1) { >> binary(as.integer(n/2)) >> } >> cat(n %% 2) >> } > > Did you mean to type "binary1(as.integer(n)"?Yes I meant that.>> When I call binary1(10) I get 1010. I believe that cat function stores >> value to a buffer appending values as recursion proceeds and at the >> end it prints the buffer. Am I right? > > No. Read the ?cat help page. It returns NULL. The material you see at the console is a side-effect. >> >> I tried to modify the function to get some understanding: >> >> binary2 <- function(n) { >> if(n > 1) { >> binary2(as.integer(n/2)) >> } >> cat(n %% 2, sep=",") >> } >> >> With call binary2(10) I get also 1010. Why the output is not separated >> by commas? > > I think because there is nothing to separate when it prints (since there was no "buffer".If I use function: binary3 <- function(n) { if(n > 1) { binary3(as.integer(n/2)) } cat(n %% 2, ",") } and call binary3(10) the console output is separated. So there must be some kind of buffer and also it looks like there is some inconsistency in how cat function behaves. Probably there is other explanation.