4

我经常saveRDS()在处理大量数据后编写语句,这促使我立即编写readRDS()以备将来访问 .RDS 文件以更快地加载到 .RDS 文件的可重现编码R。下面概述了我readRDS()从输入语句生成语句的手动过程。saveRDS()如何改进?EMACS如何在和/或中为我编写宏/函数来执行此操作R

## I type these out:
saveRDS(dems,"./_00_data_original/dems.RDS")
saveRDS(meds,"./_00_data_original/meds.RDS")
saveRDS(anti,"./_00_data_original/anti.RDS")

## Then I rectangle kill (C-x-r-k) the file names and commas
## and rectangle yank (C-x-r-y) them on the left hand side
## note:  depends on filenames being equal lengths
dems,saveRDS("./_00_data_original/dems.RDS")
meds,saveRDS("./_00_data_original/meds.RDS")
anti,saveRDS("./_00_data_original/anti.RDS")

## then I Esc-Shift-5 to query replace ",saveRDS" with " <- readRDS"
dems <- readRDS("./_00_data_original/dems.RDS")
meds <- readRDS("./_00_data_original/meds.RDS")
anti <- readRDS("./_00_data_original/anti.RDS")
4

2 回答 2

4

我能想到的两种方法是使用宏或多个游标。

我经常创建在单行上工作的宏,宏的最后一个动作是向下移动到下一行,所以我可以快速重复它。

在这种情况下,在您复制并粘贴 saveRDS 块后,在第一行:开始录制宏并执行以下操作:

  1. 转到行首
  2. 前进两个字
  3. 标记和剪切光标后面的单词
  4. 抹去逗号
  5. 转到行首
  6. 猛拉
  7. 插入“<-阅读”
  8. 删除接下来的 4 个字符(保存)
  9. 下移 1 行。
  10. 停止录制宏

关键是以一种能够普遍应用于具有给定格式的所有行的方式记录宏。确保文件名类似于“foo-bar baz”的行可以通过宏以及简单的文件名(例如“bar”)进行转换,方法是使用类似forward-wordforward-sexp而不是逐个字符移动。

然后您可以使用C-xe在下一行运行宏,然后在下一行e再次运行它,直到完成。您也使用前缀参数,因此如果您知道要将其应用于 10 行,那么您可以使用C-u10C-xe

这里我将宏记录在第一行,稍等片刻,然后快速将其应用到下面的两行。

在此处输入图像描述

name-last-kbd-macro您可以使用and将此宏保存在您的 init 中,insert-kbd-macro并在以后的会话中像命令一样使用它。

多个光标

或者您可以使用多个光标,这将允许您执行与宏相同的操作,但同时在所有行上。

https://github.com/magnars/multiple-cursors.el

在此处输入图像描述

于 2014-08-26T17:12:51.737 回答
2

也许你可以使用这样的东西:

saveRead <- function(..., path, prefix = "", envir = .GlobalEnv) {
  dots <- substitute(list(...))[-1]
  objs <- sapply(dots, deparse)
  new_objs <- paste0(prefix, objs)
  paths <- file.path(path, paste0(objs, ".RDS"))
  invisible(lapply(seq_along(objs), function(x) {
    saveRDS(get(objs[x], envir = envir), file = paths[x])
    assign(new_objs[x], readRDS(paths[x]), envir = envir)
  }))
}

这是一个例子。我只是写信给一个tempdir,但你会输入你实际想要的目录。此外,为了演示,我在对象名称(重读时)前面加上了“test_”。设置prefix""(默认)以保留原始名称。

a <- 1:2
b <- 3:4
ls()
# [1] "a"        "b"        "saveRead"

x <- tempdir()
list.files(x, ".RDS")
# character(0)

saveRead(a, b, path = x, prepend = "test_")
ls()
# [1] "a"        "b"        "saveRead" "test_a"   "test_b"   "x"       
list.files(x, ".RDS")
# [1] "a.RDS" "b.RDS"

要重现您的操作,它可以像这样使用:

saveRead(dems, meds, anti, path = "./_00_data_original")
于 2014-08-26T17:45:06.957 回答