C8H10N4O2
C8H10N4O2

Reputation: 18995

odd behavior of print within mapply

I am seeing some unexpected behavior (to me anyway) when print() is included as a side effect in a function wrapped in mapply().

For example, this works as expected (and yes I know it's not how we add vectors):

mapply(function(i,j) i+j, i=1:3, j=4:6) # returns [1] 5 7 9

And so does this:

mapply(function(i,j) paste(i, "plus", j, "equals", i+j), i=1:3, j=4:6) 
# returns [1] "1 plus 4 equals 5" "2 plus 5 equals 7" "3 plus 6 equals 9"

But this doesn't:

mapply(function(i,j) print(paste(i, "plus", j, "equals", i+j)), i=1:3, j=4:6)
# returns:
# [1] "1 plus 4 equals 5"
# [1] "2 plus 5 equals 7"
# [1] "3 plus 6 equals 9"
# [1] "1 plus 4 equals 5" "2 plus 5 equals 7" "3 plus 6 equals 9"

What's going on here? I haven't used mapply() in a while, so maybe this is a no-brainer... I'm using R version 3.4.0.

Upvotes: 2

Views: 104

Answers (1)

Ben Bolker
Ben Bolker

Reputation: 226057

print both prints its argument and returns its value.

p <- print("abc")
# [1] "abc"
p
# [2] "abc"

So each element gets printed, then the vector of stuff gets returned (and printed). Try e.g. invisible(mapply(...)) or m <- mapply(...) for comparison.

FWIW cat() returns NULL ...

Upvotes: 4

Related Questions