2010-09-10 10 views
8

R bazı fonksiyonlar bilgi basabilir ve değerler döndürebilir, baskı susturulabilir mi? ÖrneğinR'deki print() komutu sessizleştirilebilir mi?

: Ben gibi dönüşünü saklayabilir

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

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

döner

:

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

Ben "foo" ait baskı engelleyebilir miyim?

+4

Soru böyle

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

Cheers sen ... – mbq

+0

p çok kirli bir şekilde bir şey yapıyorsun önermek roblem şu ki benim fonksiyonum değil, baskı ve geri dönüş, ithal kütüphaneye dalmak, çıktıyı kapatmak istiyorum. – ayman

cevap

7

Sen fonksiyonunu

deprintize<-function(f){ 
return(function(...) {capture.output(w<-f(...));return(w);}); 
} 
tanımlayarak örneğin R gizli fonksiyonel yapısını kullanabilir 'sessiz' olanlara 'baskı' fonksiyonları dönüştürecektir

:

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

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

' quiet', bu işlev için daha iyi bir ad olabilir ... – hadley

+3

@hadley sıkıcı! – mbq

9
?capture.output 
+0

Güzel, yani örneğimde: dev.nil <- capture.output (z <- print.and.return()) hile yapar. – ayman

3

Baskı işleminin yan etkisine kesinlikle kendi işlevlerinizle ihtiyacınız varsa, neden bir seçenek yapmıyorsunuz?

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

Bir varsayılanın güzel kullanımı; Mesele bu benim fonksiyonum değil. – ayman

+0

Bunu yaptığınız birçok durumda, muhtemelen yazdırmak yerine 'message' kullanmalısınız. (Yani, "foo" 'nun baskı yöntemini kullanmak istediğiniz bir R nesnesi yerine bir dize olduğu durumlarda.) – Gregor

3

Kabul ediyorum hadley ve mbq'ün en genel çözüm olarak capture.output önerisi. Yazdığınız özel işlevler için (yani içeriği kontrol ettiğiniz öğeler), print yerine message kullanın. Bu şekilde suppressMessages ile çıkışı kaldırabilirsiniz.

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

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

Bu gönderiyi yeniden diriltebileceğimi biliyorum, ancak başkası yaptığım gibi bulabilir. Benim işlevlerin birinde aynı davranışı ilgi ve sadece "görünmezlik" rastladı:

O return() aynı kullanımı vardır ama sadece döndürülen değeri yazdırmak yoktur:

invisible(variable) 

Böylece, @ayman tarafından verilen örneğin: