5

「sparcl」パッケージは、標準の「stat」パッケージの「kmeans」関数を使用します。代わりに、独自の kmeans++ 実装を使用したいと考えています。

これを行う 1 つの方法は、sparcl パッケージ自体のコードを編集することです。面倒なので、編集したコードをRにインストールする方法がわからないため、これは避けたいと思います.

残念ながら、スーパー代入演算子 "<<-" は機能しません:

> kmeans <<- function(x) print("hi!")
Error: cannot change value of locked binding for 'kmeans'

「割り当てる」こともありません。

assign("kmeans",function(x) {print("HI THERE!"); return(FALSE)},pos="package:sparcl")
Error in assign("is.null", function(x) { : 
  cannot add bindings to a locked environment

パッケージコードを編集するのが唯一の方法ですか?

ありがとう!

4

2 に答える 2

7

インタラクティブなセッション中に関数の本体 (ただし引数は編集しない) を編集したい場合は、次trace()のようにを使用できます。

trace("kmeans", edit=TRUE)

次に、ポップアップするエディターで、本文を次のように編集します (例):

function (x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", 
"Lloyd", "Forgy", "MacQueen")) 
{
    plot(rnorm(99), col = "red")
}

編集した関数定義を保存して、エディターを終了します。

R コマンド ラインに戻り、編集した関数を表示して試してみることができます。

body(kmeans)  # To view the tracing code
kmeans()      # To use the edited function

最後に、編集前の関数に戻すには、untrace("kmeans"). (変更を簡単に取り消すことができるので、私は一般的にtrace()toassignInNamespace()と friendsを使用することを好みます。)untrace()

于 2012-10-05T15:37:50.793 に答える
2

さらに考えて(そしてあなたの質問を読み直した後)、ここにあなたのために働くべき簡単な解決策があります.

編集したバージョンのをグローバル環境kmeans()のシンボルに割り当てるだけです。kmeansつまり、コマンド ラインで次のようにします。

kmeans <- function(...) plot(rnorm(99), col="red") # but using your own edits

## Then run an example from ?KMeansSparseCluster to see that it works.
library(sparcl)
x <- matrix(rnorm(50*300),ncol=300)
x[1:25,1:50] <- x[1:25,1:50]+1
x <- scale(x, TRUE, TRUE)
KMeansSparseCluster.permute(x,K=2,wbounds=seq(3,9,len=15),nperms=5)

これが機能するのは、 KMeansSparseCluster()(および 内の他の関数への呼び出しpackage:sparcl) がkmeans 最初に in namespace:sparcl次にin imports:sparcl次にin namespace:base、次に in.GlobalEnvを検索するためkmeansですpackage:stats。自分で見てみるには、これを試してください:

parent.env(asNamespace("sparcl"))
parent.env(parent.env(asNamespace("sparcl")))
parent.env(parent.env(parent.env(asNamespace("sparcl"))))
## etc., also wrapping any of the environments above in calls to ls() 
## to see what's in 'em

シンボル検索がグローバル環境に到達する前に、独自の名前空間で検索されるため、使用する stats パッケージの関数はkmeans()バージョンによって中断されません。kmeans

于 2012-10-05T17:14:20.467 に答える