2017-09-27 9 views
3

編集:追加の完全なコードゴーストNULLコンソール出力を強制終了しますか?

は、私はそれがコンソールにはいくつかの浮遊NULLを出力除いて、作業をしているように見える「プロット」のS4の方法を作ったと私はそれがから来るのどこを見つけ出すことはできません。

print(plot(x = flux, y = 1, fastplot = TRUE, quietly = TRUE)) 

とクラス:

flux <- setClass(
    # Set the class name 
    "flux", 
    slots = c(
    raw.data = "list", 
    source.files = "character", 
    data = "matrix", 
    time = "POSIXct", 
    datatype = "character", 
    metadata = "data.frame" 
) 
) 

と方法:

setMethod("plot", 
     signature(x = "flux"), 
     function (x, y, ...) { 
     CheckFluxObject(x) 
     params <- LoadDefaults(flux = x) 
     # Interpret 'plot' arguments 
     par.restore <- par(no.readonly = TRUE) 
     on.exit(expr = par(par.restore), add = TRUE) 
     arguments <- list(...) 
     if (!("fastplot" %in% names(arguments))) { 
      fastplot <- FALSE 
     } else { 
      fastplot <- arguments$fastplot 
      arguments$fastplot <- NULL 
     } 
     if (!("quietly" %in% names(arguments))) { 
      quietly <- FALSE 
     } else { 
      quietly <- arguments$quietly 
      arguments$quietly <- NULL 
     } 
     par(ask=!(fastplot)) 
     if (!("ylab" %in% arguments)) { 
      ylab <- params["units"] 
     } else { 
      ylab <- arguments$ylab 
      arguments$ylab <- NULL 
     } 
     # Pull relevant 'flux' class object data 
     data <- slot(x, "data") 
     if (missing("y")) { 
      y <- 1:ncol(data) 
     } else { 
      stopifnot(
      is.integer(y), 
      all(y %in% 1:ncol(data)) 
     ) 
     } 
     # Bulk function execution 
     if (quietly == FALSE) { 
      message("Plotting data traces:") 
     } 
     plot.obj <- plot.new() 
     print("NULL is in the 'for' loop...") 
     for (i in y){ 
      main <- colnames(data)[i] 
      plot.obj <- plot(slot(x, "time"), data[, i], main = main, 
          xlab = "Time", ylab = ylab, unlist(arguments)) 
      print(plot.obj) 
     } 
     print("but is it also here??") 
     # Clean-up and exit 
     if (quietly == FALSE) { 
      message("Done plotting.") 
     } 
     if (length(y) == 1) { 
      invisible(plot.obj) 
     } 
     print("or here??") 
     invisible(NULL) 
     } 
) 

そのための出力は次のとおりです。ここでは、トップレベルのコードです

[1] "NULL is in the 'for' loop..." 
NULL 
[1] "but is it also here??" 
[1] "or here??" 
NULL 

場合I後に別のprint("what about here??")にスローするinvisible(NULL)、 は、それはこの行います

[1] "NULL is in the 'for' loop..." 
NULL 
[1] "but is it also here??" 
[1] "or here??" 
[1] "what about here??" 
[1] "what about here??" 

を私は予想していないよ関数の戻りや印刷コマンドのいくつかの行動はありますか? CheckFluxObject関数は、すべてのスロットが満たされていることを確認するだけです。あなたはそれはそう関数内のプロットを生成しようとしている場合

はどうやらプロットのprint方法が戻っNULLオブジェクト、および:

+1

この質問は興味深いことですが、100%再現性を高めることができればよいでしょう。 [mcve]をお読みください。 –

+1

'print(plot.obj)'からです。私はちょうどコンソール 'z = plot(1:10,1:10)'で試してみましたが、プロットは直ちに作成されましたが、変数 'z'には' NULL'が割り当てられました。 'NULL 'の変数を出力しています。 –

+0

OK、R. Schifiniのコメントは、' print(plot.obj)'の代わりに最初のものを削除するのに役立ちました。 'invisible(plot.obj) 'を使用しました。ヌルなしでOKをプロットします。今度は2番目に!私は必要なコードをすべて追加したと思います。 – brandonEm

答えて

1

私はより良い答えがポップアップするまで、これまでならば、ここではこれを残しておきますそれを行うにはinvisible(plot.object)またはinvisible(plot(x, y, ...))printではなく)を使用するのが最善の方法です。

私はまだ第二NULLがどこから来ているか分からない

...

編集:実測秒1!メソッド自体にprint(plot.obj)のように、トップレベルコードのprintNULLを投げていました。 printコマンドをすべて破棄すると、すべてのゴーストが殺されました。

関連する問題