2013-06-11 1 views
1

R, похоже, помнит все команды в истории, включая дубликаты, что очень раздражает. Как можно изменить это поведение?Как сделать R игнорировать повторяющиеся записи в истории?

Например, если я запускать эти команды

y = 3 
    x = rnorm(15) 
    x = rnorm(15) 

Я должен нажать вверх три раза, чтобы добраться до первой команды.

+0

Что определяет дубликат? идентичный вызов? или идентичные строки? –

+0

Например, запустите 'x = rnorm (15)' дважды. – qed

+0

@ Вопрос Матфея Плурда заключается в том, является ли 'c; а; б; a' в вашей истории следует разделить на 'c; б; a'. Ваш запрос не является необоснованным, но я думаю, что это будет очень трудно обойтись без глубокого взлома. Более долгосрочный подход состоял бы в том, чтобы начать использовать рабочий процесс на основе сценария, где вы вводите свои команды в редактор, а затем отправляете их в R без изменения фокуса (через горячие клавиши в RStudio/emacs/vim/Eclipse ...) –

ответ

2

Предполагая, что дубликат команды является вызов идентичен предыдущему, независимо от того, вы могли бы просто сделать что-то вроде этого:

tmp <- tempfile() 
savehistory(tmp) 
hist <- readLines(tmp) 
hist[! duplicated(hist)] 

или это, чтобы сохранить последний экземпляр команды

hist[! duplicated(hist, fromLast=TRUE)] 
+0

Все хорошо. Если ваша обеспокоенность тем, что «;» - разделенный код был правильным, можно было бы также идентифицировать эти строки и прочитать их обратно в виде текста с помощью sep = ";". –

3

Если вы фильтруете дубликаты вне зависимости от порядка, проще всего добавить pattern аргумент history(), например history(pattern=""). Из-за особенностей history реализации, даже имея pattern="" будет иметь эффект фильтрации дубликатов:

> history 
... 
    if (!missing(pattern)) 
     rawhist <- unique(grep(pattern, rawhist, value = TRUE, 
      ...)) 
... 

И если вы заботитесь о порядке, а затем просто модифицируют функцию запас history, например:

history_new = function(max.show = 25, reverse = FALSE, filter = FALSE, pattern, ...) 
{ 
    file1 <- tempfile("Rrawhist") 
    savehistory(file1) 
    rawhist <- readLines(file1) 
    unlink(file1) 

    # the modification to stock 
    if (filter) 
     rawhist <- rawhist[cumsum(rle(rawhist)$lengths)] 
    # end of modification 

    if (!missing(pattern)) 
     rawhist <- unique(grep(pattern, rawhist, value = TRUE, 
      ...)) 
    nlines <- length(rawhist) 
    if (nlines) { 
     inds <- max(1, nlines - max.show):nlines 
     if (reverse) 
      inds <- rev(inds) 
    } 
    else inds <- integer() 
    file2 <- tempfile("hist") 
    writeLines(rawhist[inds], file2) 
    file.show(file2, title = "R History", delete.file = TRUE) 
} 
+0

+1 это неожиданно. хорошая находка. –

+0

Ницца! Как вы делаете это постоянным? – qed

+0

Похоже, я должен использовать темный хак, чтобы заменить функцию истории в пакете utils. http://r.789695.n4.nabble.com/Modify-base-R-functions-in-Rprofile-site-td905121.html Существуют ли лучшие способы? – qed

Смежные вопросы