2012-07-25 3 views
39

Rヘルプはinvisible()を「オブジェクトの一時的に目に見えないコピーを返す関数」と説明しています。私はinvisible()が何のために使われているのかを理解するのが難しいです。 invisible()が何をしているのか、この機能が役に立つのはいつ説明できますか?関数invisible()は何をしますか?

print()のメソッド関数では、ほとんどの場合、invisible()が使用されています。ここでは一例です:

### 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()が何をするのか、どこで役に立つのか、最後にそれが上記のメソッドのプリント機能にあるのかを知りたいのですが?

ありがとうございました。

+13

私はあなたに答えを与えることができますが、私はそれをあなたに示すことはできません。 – mdsumner

答えて

23

?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 
7

invisible()は目に見えないその内容が一時的になり、しばしばreturn()するのではなく、使用されているが、それはむしろ、その代替としてreturn()ないと組み合わせて使用​​する必要があります。

return()は、関数の実行を停止し、その値を返しますが、invisible()はそのようなことを行いません。しばらくの間、コンテンツが見えなくなるだけです。

は、次の2つの例を考えてみましょう:

f2(1) 

関数は、その戻り値を印刷しない:

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()の落とし穴を回避しましたinvisible()の使用に変更します。しかしそれはいつものとして値を渡すん:

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

invisible()のユースケースは、例えばあります出力のページの後にページを生成する関数の戻り値や、その副作用のために関数が呼び出され、戻り値が返されるのを防ぐ。さらなる情報を提供するためにのみ使用されます...

+1

Rが他のプログラミング言語から来ていると、Rが暗黙的にたくさんのものを印刷することがわかった方が理にかなっています。私はそのような印刷を副作用と見なし、invisible()はそうしないと考えています。 – Chris

関連する問題