我经常在大量数据修改后写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")
答案 0 :(得分:4)
我能想到的两种方法是使用宏或多个游标。
我经常创建在一行上工作的宏,宏的最后一个动作是向下移动到下一行,所以我可以快速重复它。
在这种情况下,复制并粘贴saveRDS块后,在第一行:开始录制宏并执行以下操作:
关键是以一种能够将genericaly应用于具有给定格式的所有行的方式来记录宏。通过使用像forward-word
或forward-sexp
之类的东西而不是移动字符,可以通过宏以及像“bar”之类的简单文件名来确定文件名类似于“foo-bar baz”的行。字符。
然后你可以使用 Cx e 在下一行运行宏,然后按 e 再次运行它下一行直到完成。您也使用前缀参数,因此如果您知道要将其应用于10行,则可以使用 Cu 10 Cx 电子
在这里,我在第一行录制宏,等待一秒,然后快速将其应用到下面的两行。
您可以使用name-last-kbd-macro
和insert-kbd-macro
将此宏保存在init中,并在将来的会话中将其用作命令。
或者您可以使用多个游标,这将允许您执行与宏相同的操作,但同时在所有行上执行。
https://github.com/magnars/multiple-cursors.el
答案 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")