Hi David, Thanks for the correction concerning the "else" issue. Taking your code and removing some lines (to increase readability):
library(pryr) data <- array(dim = c(5)) for(x in 1:5) { data[x] <- as.integer(x * 2) } #print(data) add = address(data) for(x in 1:5) { data[x] <- as.integer(0) } if (add == address(data)) { print("Address did not change") } else { print("Address changed") } If one runs this code everything works as expected, i.e. message "Address did not change" is printed. However, if one uncomments line "#print(data)", message "Address is changed" is printed instead. Any idea why this happens as it is a bit counter-intuitive? Is it something to do with some kind of lazy-evaluation mechanism R has that makes the array to be filled-up only when needed (in this case, when printing it) thus changing the array's address? Thank you once more! Sent: Sunday, November 12, 2017 at 6:02 PM From: "David Winsemius" <dwinsem...@comcast.net> To: "lille stor" <lille.s...@gmx.com> Cc: r-devel@r-project.org Subject: Re: [Rd] Array changing address unexpectedly > On Nov 12, 2017, at 8:47 AM, lille stor <lille.s...@gmx.com> wrote: > > Hi, > > Given the following R code: > > library(pryr) > > data <- array(dim = c(5)) > > for(x in 1:5) > { > data[x] <- as.integer(x * 2) > } > > add = address(data) # save address of "data" > > for(x in 1:5) > { > data[x] <- as.integer(0) > } > > if (add == address(data)) > { > print("Address did not change") > } > else > { > print("Address changed") > } > > If one runs this code, message "Address changed" is printed. However, if one > comments line "data[x] <- as.integer(0)" the address of "data" does not > change and message "Address did not change" is printed instead. Why? The > datatype of the array should not change with this line and hence no need for > R to convert the array to a different type (and have the array's address > changing in the process). I'm guessing you didn't take note of the error message: > else Error: unexpected 'else' in " else" It's always good practice to investigate errors. The else function needs to come immediately after the "{". Here's a more complete test of what I take to be your question: library(pryr) data <- array(dim = c(5)) add = address(data) for(x in 1:5) { data[x] <- as.integer(x * 2) } if (add == address(data)) { print("Address did not change") } else { print("Address changed") } data <- array(dim = c(5)) # reset add = address(data) for(x in 1:5) { data[x] <- as.integer(0) } if (add == address(data)) { print("Address did not change") } else { print("Address changed") } # changes in both situations. > > Thank you! > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel David Winsemius Alameda, CA, USA 'Any technology distinguishable from magic is insufficiently advanced.' -Gehm's Corollary to Clarke's Third Law ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel