8

これは私にとって非常に便利です。の出力をls()日付 (最終更新日など) で並べ替えることはできますか?

コンテキスト:さまざまなdata.frames,variablesおよびplots. を見つける必要がありますが、data.frameそれを何と呼んだか思い出せません。最近取り組んでいたということだけです。したがってls()、変更日でソートすると、私がそれを何と呼んだかを理解するのに役立ちます。

明確にするために:これは の使用に関する質問ではありませんhistory()。私は履歴を頻繁に使用し、必要になると思われるときに保存することがよくあります。この場合、履歴は必要な期間をカバーしていないため、data.frame使用を見つけることができませんhistory()

追加:最近作成された を見つけるという前述のタスクは別として、一般に、日付に従ってdata.frameソートできると非常に便利です。ls()ワークスペースには、2 年以上取り組んできた 100 をはるかに超えるオブジェクトがあります (2 年を検索するのhistoryも楽しくありません)。これらのオブジェクトを時系列に並べ替えることができれば、どれがより新しく (編集された可能性もあり)、どれがより古い (おそらくオリジナルである) かについて、ある程度のアイデアが得られるでしょう。

私は、個々のオブジェクトをより小さな関連するワークスペースにゆっくりと移動することで、ワークフローを改善しようとしました。しかし、このプロセスには時間がかかり、本質的に無意味です (とにかくデータ分析の終わりに近づいているため)。

4

6 に答える 6

4

関数を使用して、対象の変数への変更のログ記録を自動化することもできmakeActiveBindingます。次に、ログを使用して、出力をls()変更時間で並べ替えることができます。

1 つの注意点は、この方法を使用する場合、変数を最初に使用する前に追跡を設定する必要があることです。

.change.log <- list()
track <- function(variable) {
    makeActiveBinding(variable,
        function(v) 
            if (! missing(v)) 
            .change.log[[variable]] <<- c(.change.log[[variable]], 
                                           as.list(Sys.time())),
        .GlobalEnv)
}

track('x')
x <- 1
.change.log
x <- 2
.change.log

が変更されるたびxに、 に指定された無名関数が新しい値と等しい値でmakeActiveBinding呼び出されます。vこの関数xは が参照されたときにも呼び出されますが、この場合は何も指定されていないため、値が変更されたときにのみログを更新したい ---vという条件付きです。missing(v)


編集

さらに検討した結果、より良い代替手段makeActiveBindingは、関数を介して変更ロガーをインストールすることaddTaskCallbackです。<-以下のコードは、演算子が最上位で使用されるたびに変数名でタイムスタンプを記録する自動ロガーを作成します。

# define a log maker function. This returns a new logger function
# bound with a fresh log.
mk.log <- function() {
    log <- list()
    # handler functions have to have these four args, but we only use the first.
    function(expr, value, ok, visible) {
        if (class(expr) == '<-') {
            # convert the assignment call to a list, so the 
            # variable name can be extracted
            call.list <- as.list(expr)
            # extract the name of the variable being affected, and 
            # convert it to character, so we can use it as a list name
            variable <- as.character(call.list[[2]])
            # append a timestamp to the log for this variable
            log[[variable]] <<- c(log[[variable]], list(Sys.time()))
        }
        # callback handlers need to return a bool
        return(TRUE)
    }
}

# assign the handler to .log, and install it.
addTaskCallback(.log <- mk.log(), name='log')

x <- 5
x <- 10
y <- 4

# read the log
environment(.log)$log

# $x
# $x[[1]]
# [1] "2013-01-25 10:24:26.581 EST"
# 
# $x[[2]]
# [1] "2013-01-25 10:24:26.585 EST"
# 
# 
# $y
# $y[[1]]
# [1] "2013-01-25 10:24:26.589 EST"
于 2013-01-23T14:44:44.910 に答える
3

ちょっと独創的なハッキングを行えば、変数用に独自のメソッドを作成できます。例えば:

datedmatrix<-function(data,nrow,ncol,...) {
    output <- matrix(data, nrow=nrow,ncol=ncol,...)
    attr(output,'create') <- date()
    return(output)
}
于 2013-01-23T14:10:28.767 に答える
2

いいえ、ただし、history関数を使用して、実行した最新のコマンドからその名前を見つける必要があります。

デフォルトでhistoryは、コードの最後の 25 行が表示されますが、次のようにしてさらに要求できます。

history(max.show = 100)

表示できる行数にも厳しい制限があります。R_HISTSIZEこれは、デフォルトが 512 である環境変数の値と同じです。ただし、ドキュメントには次のように記載されています。

セッション中に保持される履歴の行数に制限はありません [...]

あなたができるように:

Sys.setenv("R_HISTSIZE" = 10000)
history(max.show = 10000)

セッションを開始してからのすべての履歴を確認できるはずです (10000 行未満のコードを実行したと仮定します)。

于 2013-01-23T11:59:50.037 に答える
1

を使用できますls.str(mode="list")

出力例:

b : 'data.frame':   1 obs. of  1 variable:
 $ test: Factor w/ 1 level "a": 1
c : 'data.frame':   1 obs. of  1 variable:
 $ x: num 1

作成時間が R オブジェクトに保存されているとは思いません。

于 2013-01-23T12:15:19.930 に答える
0

直接の回答ではありませんが、個人的にはRStudioを使っています。

Rstudioには、非常に優れた検索オプションを備えたタブ履歴(主に履歴Rコマンドを使用)があります。

ここで、単語ソースの履歴を検索します。 ここに画像の説明を入力

詳細を取得するには、この履歴の各行のコンテキストに移動します。たとえば、ここでは最初の行の詳細です。 ここに画像の説明を入力

于 2013-01-23T12:06:03.500 に答える