Подтвердить что ты не робот

Что делает функция invisible()?

R help объясняет invisible() как "функцию, которая возвращает временно невидимую копию объекта". Мне трудно понять, для чего используется invisible(). Сможете ли вы объяснить, что делает invisible() и когда эта функция может быть полезна?

Я видел, что invisible() почти всегда используется в функциях метода для print(). Вот один пример:

### My Method function:
print.myPrint <- function(x, ...){
  print(unlist(x[1:2]))
  invisible(x)
}

x = list(v1 = c(1:5), v2 = c(-1:-5) )
class(x) = "myPrint"
print(x)

Я думал, что без invisible(x) я не смог бы выполнить назначение, например:

a = print(x)

Но на самом деле это не так. Итак, я хотел бы знать, что делает invisible(), где это может быть полезно, и, наконец, какова его роль в функции печати метода выше?

Большое спасибо за вашу помощь.

4b9b3361

Ответ 1

От ?invisible:

Подробнее:

 This function can be useful when it is desired to have functions
 return values which can be assigned, but which do not print when
 they are not assigned.

Таким образом, вы можете назначить результат, но он не будет напечатан, если не назначен. Он часто используется вместо return. Ваш метод print.myPrint печатает только потому, что вы явно вызываете print. Вызов invisible(x) в конце вашей функции просто возвращает копию x.

Если вы не использовали invisible, x также был бы напечатан, если не назначен. Например:

R> print.myPrint <- function(x, ...){
+   print(unlist(x[1:2]))
+   return(x)
+ }
R> print(x)
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
  1   2   3   4   5  -1  -2  -3  -4  -5 
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
  1   2   3   4   5  -1  -2  -3  -4  -5 

Ответ 2

Пока invisible() делает его контент временно невидимым и часто используется вместо return(), его следует использовать в комбинации с return(), а не как его замену.

Пока return() прекратит выполнение функции и вернет значение, введенное в нее, invisible() не сделает ничего подобного. Это только делает его содержимое невидимым на некоторое время.

Рассмотрим следующие два примера:

f1 <- function(x){
  if( x > 0 ){
     invisible("bigger than 0")
  }else{
     return("negative number")
  }
  "something went wrong"
}

result <- f1(1)

result
## [1] "something went wrong"



f2 <- function(x){
  if( x > 0 ){
     return(invisible("bigger than 0"))
  }else{
     return("negative number")
  }
}

result <- f2(1)

result
## [1] "bigger than 0"

Обходя invisible() ловушку, мы можем взглянуть на ее работу:

f2(1)

Функция не выводит свое возвращаемое значение из-за использования invisible(). Однако он передает значение как обычно:

res <- f2(1)
res 
## [1] "bigger than 0"

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