2016-08-30 7 views
3

もう1つ関連するquestionがありますが、私が探しているのは答えではありません。私はオブジェクトに割り当てることができるが、割り当てられていても出力を印刷するが、それを二重に印刷することはできない関数を必要とする。この場合R機能 - 割り当てられていないときに印刷

:この場合

fun <- function(x) { 
print(x+1) 
x+1 
} 
a <- fun(3) 

、それは両方に保存します、そしてそれは私が欲しいものである、コンソールに印刷します。

しかし、この場合には:

fun(3) 

それは二回、コンソールに印刷します。ケース2に二重印刷を行わずに、ケース1から目的の結果を得る方法はありますか?

+0

「print(x + 1)」行を削除すると機能します。 – polka

+0

@polkaこれは、新しいオブジェクトに割り当てるときに結果を出力しなくなり、上記のケース1を満たしません。 –

+0

私はあなたの質問をはっきりと理解していません。もっと具体的に考えるか? – polka

答えて

5

あなただけ見えない機能でそれをラップすることができ、あなたはまだあなたの関数は「X + 1」の値を返すようにしたいと仮定すると:

fun <- function(x) { 
    print(x+1) 
    invisible(x+1) 
} 

> fun(3) 
[1] 4 

> a = fun(3) 
[1] 4 

> a 
[1] 4 

これは一度だけ、それをプリントアウトします、まだ保持しつつ、 'x + 1'の値。

1

この同じ動作は、括弧で囲んでオブジェクトを目に見える形で返すRの関数でも実行できます。

fun <- function(x) { 
    x+1 
} 

> (fun(3)) 
[1] 4 

> (a = fun(3)) 
[1] 4 

> a 
[1] 4 

また、同等の意味では、printにあなたの割り当てを呼び出すことができます。

> print(fun(3)) 
[1] 4 

私は関数にこの機能を転がるかわからないが、関数の外に存在print方法を使用しての上にどんなメリットがあります。

+1

* "この機能を関数にロールオーバーすることは、関数の外部で既存の印刷メソッドを使用することよりも利点があります。" * - 質問の相対頻度を指定すると(http://stackoverflow.com/ q/39154353/903061)、人々は自動的に印刷されたメッセージを無効にするのに苦労しています。私は大きな損害があると言います。 – Gregor

+0

他の質問を見ると、私はあなたに同意する傾向があります。 – Benjamin

1

R関数は、「副作用」のためにマスクされていてはいけません。これはルールではありませんが、強くお勧めします。それが良い習慣であることの証拠として、ふわふわした機能がprintまたはcatを使用して出力を印刷し、エンドユーザーが無効にするのに苦労しているSO like this oneに関する多くの質問があります。

これに基づいて、print()ではなくmessage()を使用するか、印刷を無効にする引数を追加することを強くお勧めします。 message()は、実行中にコンソールに「正しい」方法で印刷されますが、データ構造に応じて結果をうまくフォーマットしません。

fun <- function(x) { 
    result = x + 1 
    message(result) 
    invisible(result) 
} 

それはより複雑な出力を持っている可能性がある場合、あなたは(mtcarsにデモ)このような何かを試みることができる:

あなたの関数は、単純な出力を想定した場合

したがって、その後、私はこのようにそれをやって推薦します

fun <- function(x) { 
    result = head(mtcars) 
    sapply(capture.output(print(result)), message) 
    invisible(result) 
} 

メッセージを簡単suppressMessages()に呼び出しをラップすることによって抑制することができ、かつmessage = Fは、「メッセージを無視」と言うためにknitrコードの塊のための便利な引数です。


他のオプションは

fun <- function(x, quietly = FALSE) { 
    result = x + 1 
    if (!quietly) print(result) 
    invisible(result) 
} 

引数を追加することであり、私も長く、この奇妙な行動が本当に必要かどうかについて、ハードだと思うだろう。通常、期待通りに動作する関数を持つことは、期待を払う特別なケースを持つよりも優れています。

関連する問題