Р: У меня есть функция с невидимым возвращаемым значением, как я могу векторизовать ее и не получить огромный нулевой результат? - PullRequest
0 голосов
/ 26 апреля 2020

Я написал довольно простую функцию, которая, как мне кажется, ничего не возвращает:

bar<-function(a,b)
{
  if(foo(a,b)){print(c(a,b))}
  return(invisible())
}

Я хочу вызвать эту функцию для огромной матрицы, например, outer(1:100,1:100,Vectorize(bar)). При этом я получаю желаемую печать, но я также получаю вывод огромного массива значений NULL. Как я могу адаптировать этот код, чтобы избавиться от огромного массива NULL и не потерять желаемую печать?

1 Ответ

0 голосов
/ 26 апреля 2020

Это происходит, когда вы вызываете побочный эффект в баре () и затем перепрыгиваете на верхний уровень. Функция bar () завершает побочный эффект (печать), затем возвращает последнее значение последней команды на верхний уровень.

Это расположение возвращает один NULL независимо от размеров a и b. Как и в ...

a <- matrix(1:9,nrow=3,ncol=3)
b <- matrix(1:9,nrow=3,ncol=3,byrow=TRUE)

foo <- function(a,b) {
                      exists("a")
                      exists("b")
                     }

bar <- function(a,b) {
                      if(foo(a,b)) {print(c(a,b))}
                      NULL  # or equivalently: return()
                     }

x <- bar(a,b)  # x will be a single NULL

В качестве альтернативы, вы можете просто сделать то, что в bar (), что вы хотите, возвращать a и b соответствующим образом, а затем печатать вне функции, используя возвращаемые значения. В большинстве случаев это, вероятно, будет лучшей идеей. Также оператор «<< -» может быть полезен здесь, хотя глобальные переменные имеют свои проблемы, помимо побочного эффекта здесь. </p>

...