Странное поведение печати в mapply

Я вижу неожиданное поведение (для меня в любом случае), когда print() включен как побочный эффект в функцию, заключенную в mapply(),

Например, это работает как ожидалось (и да, я знаю, что это не то, как мы добавляем векторы):

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

И так же это:

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"

Но это не так:

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"

Что тут происходит? Я не использовал mapply() через некоторое время, так что, может быть, это не сложно... Я использую R версии 3.4.0.

1 ответ

Решение

print оба выводят свой аргумент и возвращают его значение.

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

Таким образом, каждый элемент печатается, а затем возвращается вектор материала (и печатается). Попробуйте например invisible(mapply(...)) или же m <- mapply(...) для сравнения.

FWIW cat() возвращается NULL...

Другие вопросы по тегам