16

出力が何かに割り当てられている()かどうかを検出する方法を関数に書き込むにはどうすればよい<-ですか?理由は、メッセージが割り当てられておらず、コンソールに移動するだけの場合はメッセージを印刷したいのですが、割り当てられている場合はメッセージを印刷しないようにしたいということです。

ダミーの例と、それをどのように動作させたいかを次に示します。

fun <- function(x) {
    if (being_assigned) {
        print("message")
    }
    return(x)
}

#no assignment so message prints 
> fun(6)  
[1] "message"
[1] 6

#assignment so message does not prints
> x <- fun(6)

関数内は、being_assigned検出したいが方法がわからない架空の未知の状態です。

4

2 に答える 2

14

私ができる最善のことは、関数によって返されるオブジェクトの特別なprintメソッドを定義することだと思います。

## Have your function prepend "myClass" to the class of the objects it returns
fun <- function(x) {
    class(x) <- c("myClass", class(x))
    x
}

## Define a print method for "myClass". It will be dispatched to 
## by the last step of the command line parse-eval-print cycle.
print.myClass <- function(obj) {
    cat("message\n")
    NextMethod(obj)
}

> fun(1:10)
message
 [1]  1  2  3  4  5  6  7  8  9 10
attr(,"class")
[1] "myClass"
>
> out <- fun(1:10)
> 
于 2012-10-24T19:51:55.553 に答える
2

私はジョシュのアイデアが大好きですが、将来のポスターのために、彼のアプローチのわずかに修正されたバージョンである私がしたことを示したいと思いました。彼のアプローチは、私が気に入らなかった唯一のことであるクラス情報を印刷します。彼はNextMethod、無限再帰印刷を回避するためにを使用しました。これにより、

attr(,"class")
[1] "myClass"

印刷する。したがって、これを回避するために、最初にメッセージを出力してから、クラスオブジェクトの長さ全体に1を出力します(インデックスを使用)。

fun <- function(x) {
    class(x) <- 'beep'
    comment(x) <- "hello world"
    return(x)
}

print.beep<- function(beep) {
    cat(paste0(comment(beep), "\n"))
    print(beep[1:length(beep)])
}


> fun(1:10)
hello world
 [1]  1  2  3  4  5  6  7  8  9 10

Joshのアイデアに改めて感謝します。

[1]読者が小さなインデックスを印刷したくない場合は、次のcatように印刷ステートメントを出力できます。

print.beep<- function(beep) {
    cat(paste0(comment(beep), "\n"))
    cat(beep[1:length(beep)], "\n")
}
于 2012-11-03T14:56:27.280 に答える