从saveRDS()语句自动编写readRDS()语句

时间:2014-08-26 16:35:24

标签: r emacs data-munging

我经常在大量数据修改后写saveRDS()语句,这促使我立即写readRDS()以便将来可重复编码访问.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")

2 个答案:

答案 0 :(得分:4)

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

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

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

  1. 转到行首
  2. 前进两个字
  3. 在光标后面标记并剪切字词
  4. 删除逗号
  5. 转到行首
  6. 抽出
  7. 插入“&lt; - read”
  8. 删除接下来的4个字符(保存)
  9. 向下移动1行。
  10. 停止录制宏
  11. 关键是以一种能够将genericaly应用于具有给定格式的所有行的方式来记录宏。通过使用像forward-wordforward-sexp之类的东西而不是移动字符,可以通过宏以及像“bar”之类的简单文件名来确定文件名类似于“foo-bar baz”的行。字符。

    然后你可以使用 Cx e 在下一行运行宏,然后按 e 再次运行它下一行直到完成。您也使用前缀参数,因此如果您知道要将其应用于10行,则可以使用 Cu 10 Cx 电子

    在这里,我在第一行录制宏,等待一秒,然后快速将其应用到下面的两行。

    enter image description here

    您可以使用name-last-kbd-macroinsert-kbd-macro将此宏保存在init中,并在将来的会话中将其用作命令。

    多个游标

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

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

    enter image description here

答案 1 :(得分:1)

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

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")