Я хочу подавить вывод одной команды (в данном случае applyфункции).
Можно ли это сделать без использования sink()? Я нашел описанное ниже решение, но хотел бы сделать это, если возможно, в одну строку.
Я хочу подавить вывод одной команды (в данном случае applyфункции).
Можно ли это сделать без использования sink()? Я нашел описанное ниже решение, но хотел бы сделать это, если возможно, в одну строку.
capture.output. Или используйте *_plyиз пакета plyr.
lapply, без вывода на печать, то l_ply из его plyrпакета, вероятно, будет наиболее подходящим выбором.
Ответы:
Непонятно, почему вы хотите обойтись без этого sink, но вы можете заключить в invisible()функцию любые команды, и она подавит вывод. Например:
1:10 # prints output
invisible(1:10) # hides it
В противном случае вы всегда можете объединить вещи в одну строку с помощью точки с запятой и круглых скобок:
{ sink("/dev/null"); ....; sink(); }
invisible()подавляет только печать выражения, это не sink()однострочный текст.
apply, в соответствии с вопросом: invisible(apply(matrix(1:10), 1, as.numeric)).
{ sink("/dev/null"); ....; sink(); }я определенно предпочел capture.output, как это capture.outputфактически сделано точно выше, просто намного лучше (посмотрите на источник, он вызывает сток, как описано выше, плюс некоторые приятные вещи вокруг него).
idwпод Windows. Я думаю, что лучшим решением будет использованиеsink
Используйте capture.output()функцию. Он работает как одноразовый sink()и, в отличие от invisible()него, может подавлять не только сообщения печати. Установите аргумент файла в /dev/nullUNIX или NULв Windows. Например, учитывая примечание Дирка:
> invisible(cat("Hi\n"))
Hi
> capture.output( cat("Hi\n"), file='NUL')
>
capture.output(x <- log(2))и после этого xимеет значение log(2)...
Следующая функция должна делать именно то, что вы хотите:
hush=function(code){
sink("NUL") # use /dev/null in UNIX
tmp = code
sink()
return(tmp)
}
Например, с функцией здесь:
foo=function(){
print("BAR!")
return(42)
}
Бег
x = hush(foo())
Присваивает 42 переменной x, но не выводит "BAR!" в STDOUT
Обратите внимание, что в ОС UNIX вам нужно будет заменить «NUL» на «/ dev / null»
R автоматически выводит только неназначенные выражения, поэтому просто присвойте результат applyпеременной, и он не будет напечатан.
print()или, cat()которые переходят к экрану, а не к назначению.
Если кто-то прибывает сюда в поисках решения, применимого к RMarkdown, это подавит весь вывод:
```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({
# Your code goes here
2 * 2
# etc
# etc
})})
```
Код будет запущен, но вывод не будет напечатан в HTML-документе.
Делаем комментарий Хэдли к ответу (надеюсь, что он будет лучше виден). Использование семейства apply без печати возможно с использованием plyrпакета
x <- 1:2
lapply(x, function(x) x + 1)
#> [[1]]
#> [1] 2
#>
#> [[2]]
#> [1] 3
plyr::l_ply(x, function(x) x + 1)
Создано 2020-05-19 пакетом REPEX (v0.3.0)
invisible(cat("Dataset: ", dataset, fill = TRUE))
invisible(cat(" Width: " ,width, fill = TRUE))
invisible(cat(" Bin1: " ,bin1interval, fill = TRUE))
invisible(cat(" Bin2: " ,bin2interval, fill = TRUE))
invisible(cat(" Bin3: " ,bin3interval, fill = TRUE))
производит вывод без NULL в конце строки или на следующей строке
Dataset: 17 19 26 29 31 32 34 45 47 51 52 59 60 62 63
Width: 15.33333
Bin1: 17 32.33333
Bin2: 32.33333 47.66667
Bin3: 47.66667 63