2010-09-10 56 views
8

在R中某些函數可以打印信息並返回值,打印是否可以靜音?R中的print()命令是否可以靜音?

例如:

print.and.return <- function() { 
    print("foo") 
    return("bar") 
} 

回報

> print.and.return() 
[1] "foo" 
[1] "bar" 
> 

我可以存儲喜歡的收益:

> z <- print.and.return() 
[1] "foo" 
> z 
[1] "bar" 
> 

我可以抑制"foo"打印?

+4

問這樣的建議,你正在做的事情非常骯髒的方式...... – mbq 2010-09-10 06:59:06

+0

在p問題在於它不是我的功能,它打印和返回,缺少進入導入庫的潛水,我想靜音輸出。 – ayman 2010-09-13 18:11:28

回答

7

您可以通過定義功能

deprintize<-function(f){ 
return(function(...) {capture.output(w<-f(...));return(w);}); 
} 
使用的R隱藏的功能性質,例如

,將 '打印' 功能轉換爲 '無聲' 的:

noisyf<-function(x){ 
print("BOO!"); 
sin(x); 
} 

noisyf(7) 
deprintize(noisyf)(7) 
deprintize(noisyf)->silentf;silentf(7) 
+0

'quiet'可能是該函數的一個更好的名字... – hadley 2010-09-10 15:45:29

+3

@哈利枯燥! – mbq 2010-09-10 16:21:36

9
?capture.output 
+0

不錯,所以在我的例子中:dev.nil < - capture.output(z < - print.and.return())這樣做。 – ayman 2010-09-13 18:14:40

3

如果你絕對需要在自己的功能中打印的副作用,爲什麼不把它作爲一個選項?

print.and.return <- function(..., verbose=TRUE) { 
    if (verbose) 
    print("foo") 
    return("bar") 
} 


> print.and.return() 
[1] "foo" 
[1] "bar" 
> print.and.return(verbose=FALSE) 
[1] "bar" 
> 
+0

不錯的使用默認;問題是這不是我的功能。 – ayman 2010-09-14 01:23:06

+0

在許多情況下,你應該使用'message'而不是打印。 (也就是說,在你的''foo「'是一個字符串的情況下,而不是你想要使用打印方法的R對象。) – Gregor 2015-03-11 22:17:32

3

我同意與哈德利和姆布克的建議capture.output作爲最普遍的解決方案。對於您編寫的功能(即您控制內容的功能)的特例,請使用message而不是print。這樣你可以用suppressMessages來抑制輸出。

print.and.return2 <- function() { 
    message("foo") 
    return("bar") 
} 

# Compare: 
print.and.return2() 
suppressMessages(print.and.return2()) 
1

我知道我可能會復活這篇文章,但其他人可能會像我那樣找到它。我在我的職能之一是興趣相同的行爲和我對面的「隱形」來了:

它具有相同的使用return(),但它只是不打印返回值:

invisible(variable) 

因此,對於由@ayman給出的例子:

print.and.return2 <- function() { 
    message("foo") 
    invisible("bar") 
} 

乾杯

相關問題