함수의 출력 억제


90

하나의 명령 (이 경우 apply함수) 의 출력을 억제하려고합니다 .

사용하지 않고 할 수 sink()있습니까? 아래에 설명 된 해결책을 찾았지만 가능하면 한 줄로이 작업을 수행하고 싶습니다.

출력을 억제하는 방법


2
'인라인으로 수행'이 무슨 뜻인지 설명해 주시겠습니까? 그렇지 않으면 귀하가 인용 한 질문이 이미 답변을 제공하며 이것은 중복입니다.
Dirk Eddelbuettel

1
이 솔루션에는 출력을 다시 지정하기 위해 하나의 리디렉션 출력, 명령 및 다른 라인이 필요합니다.
토르

8
또는 capture.output. 또는 *_ply플라이어 패키지에서 사용 하십시오.
hadley

1
저는 Hadley의 제안을 두 번째로합니다 lapply. 출력을 인쇄하지 않고 , 같은 적용 기능을 실제로 실행하려는 경우 그의 plyr패키지 에서 'l_ply' 가 가장 적절한 선택 일 것입니다.
Sharpie

답변:


93

를 사용하지 않고이 작업을 수행하려는 이유는 분명하지 sink않지만 invisible()함수 에서 모든 명령을 래핑 할 수 있으며 출력을 억제합니다. 예를 들면 :

1:10 # prints output
invisible(1:10) # hides it

그렇지 않으면 항상 세미콜론과 괄호를 사용하여 항목을 한 줄로 결합 할 수 있습니다.

{ sink("/dev/null"); ....; sink(); }

5
'invisible (cat ( "Hi \ n"))'시도- 한 줄짜리 invisible()가 아닌 표현식의 인쇄 만 억제합니다 sink().
Dirk Eddelbuettel

2
맞아요,하지만 질문에서 빠진 것이 없다면 질문자의 요구를 충족한다고 생각합니다 ...
Shane

1
예를 들어, 이것은 apply질문에 따라의 반환을 억제합니다 : invisible(apply(matrix(1:10), 1, as.numeric)).
Shane

{ sink("/dev/null"); ....; sink(); }내가 확실히 선호하는 것 보다 capture.output, capture.output효과적으로 위에서 정확히했던 것처럼 훨씬 낫다 (소스를 살펴보면 위의 패션에서 싱크라고 부르고 그 주변에 좋은 것들을 더한다).
Cookie

3
idwWindows 에서 작동하지 않습니다 . 나는 최고의 솔루션을 사용하고있는 것sink
TMS

58

capture.output()기능을 사용하십시오 . 일회성처럼 작동하며 sink()와 달리 invisible()인쇄 메시지 이상을 억제 할 수 있습니다. /dev/nullUNIX 또는 NULWindows 에서 파일 인수를로 설정하십시오 . 예를 들어 Dirk의 메모를 고려하면 다음과 같습니다.

> invisible(cat("Hi\n"))
Hi

> capture.output( cat("Hi\n"), file='NUL')
> 

10
이 값을 반환하는 함수에 적용하고이 값을 사용하려는 경우 작동하지 않습니다.
TMS

8
@TMS 지난 몇 달 동안 뭔가 바뀌 었나요? 난 그냥 함수에서 반환하는 값을 사용하여 테스트하고 일했다 ... capture.output(x <- log(2))그리고 이후 x의 값을 가지고 log(2)...
drmariod

10

아래와 같이 'capture.output'을 사용할 수 있습니다. 이렇게하면 나중에 데이터를 사용할 수 있습니다.

log <- capture.output({
  test <- CensReg.SMN(cc=cc,x=x,y=y, nu=NULL, type="Normal")
})

test$betas

9

R은 할당되지 않은 표현식의 출력 만 자동으로 인쇄하므로의 결과를 apply변수에 할당 하면 인쇄되지 않습니다.


4
일부 기능은이 print()또는 cat()그들에 그되지 과제로, 화면으로 이동합니다.
keithpjolley

9

다음 함수는 원하는 것을 정확하게 수행해야합니다.

hush=function(code){
  sink("NUL") # use /dev/null in UNIX
  tmp = code
  sink()
  return(tmp)
}

예를 들어 여기에 함수가 있습니다.

foo=function(){
  print("BAR!")
  return(42)
}

달리는

x = hush(foo())

x에 42를 할당하지만 "BAR!"를 인쇄하지 않습니다. STDOUT에

UNIX OS에서는 "NUL"을 "/ dev / null"로 바꿔야합니다.


이것은 내가 필요한 것을 과소 평가 한 유일한 대답이었습니다.
tomka

정확히 내가 필요했던 것
gaspar

3

RMarkdown에 적용 할 수있는 솔루션을 찾고있는 사람이 여기에 도착하면 모든 출력이 표시되지 않습니다.

```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({

# Your code goes here
2 * 2
# etc
# etc


})})
```

코드는 실행되지만 출력은 HTML 문서에 인쇄 되지 않습니다.


1

답변에 대한 해들리의 코멘트 만들기 (더 잘 보이게하기를 바랍니다). 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에 reprex 패키지 (v0.3.0)에 의해 생성됨


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.