Альтернативы системе() в R для вызова sed, rsync, ssh и т.д.: Существуют ли функции, следует ли писать самостоятельно, или я пропущу точку?
Недавно я нашел команды base::files
. Наряду с другими командами типа getwd
, write.lines
, file.show
, dir
и т.д., Похоже, существует ряд R эквивалентов функций bash.
Я также написал некоторые функции в R, которые упорядочивают вызовы на ssh
и rsync
через system
.
например:
rsync <- function(from, to){
system(paste('rsync -outi', from, to, sep = ' '), intern=TRUE)
}
Но прежде чем я углубится в это, у меня есть несколько вопросов:
- У R уже есть встроенные команды для общих программ оболочки, если да, где я могу их найти?
- Если нет, есть ли причины избежать написания моих собственных функций?
- есть ли лучшая альтернатива подходу, описанному выше в примере
rsync
?
- будет ли сбор таких функций гарантировать пакет?
Ответы
Ответ 1
имеет ли R уже встроенные команды для общих программ оболочки, если так, где я могу их найти?
Есть некоторая функция вроде grep
, которая имитирует прогамы оболочки. Найдите их, как и любую другую функцию – имена часто совпадают.
Если нет, есть ли причины, чтобы не писать собственные функции?
Нет очевидных проблем.
есть ли лучшая альтернатива подходу, описанному в rsync пример выше?
Выглядит хорошо, но вам нужно быть очень осторожным при проверке ввода пользователя, если вещи передаются в оболочку.
будет ли сбор таких функций гарантировать пакет?
Совершенно верно. Пойдите для этого.
Ответ 2
Я начал спускать этот маршрут с обертыванием git функций для devtools, но в итоге понял, что мне нужно:
bash <- function() system("bash")
с небольшим количеством оберток, чтобы убедиться, что я оказался в правильном каталоге.
Ответ 3
Там не так много, видимо...
> library(sos)
> findFn("rsync")
found 0 matches
x has zero rows; nothing to display.
Warning message:
In findFn("rsync") : HIT not found in HTML; processing one page only.
> findFn("ssh")
found 27 matches; retrieving 2 pages
2
Образы ssh
- это либо ложные срабатывания, либо часть пакетов параллельной обработки (GridR
, nws
, biopara
). RCurl
имеет команду scp
(на основе libcurl
, а не системный вызов).
Ответ 4
ОБНОВЛЕНО
благодаря @hadley для указания этого значения - штраф времени был вызван использованием аргумента intern = TRUE
, см. обновление ниже.
Вместо того, чтобы удалять ответ, я собираюсь оставить ответ здесь для справки, если он не получит много downvotes
После создания нескольких таких команд я понял один недостаток (потенциально значимый):
Приобретение системного вызова в функции увеличивает скорость, с которой вызывается функция, почти в 8 раз в этом примере:
Использование system
:
system.time(system(paste('rsync -outi', '~/dir/files* ', 'serverhost:')))
user system elapsed
0.060 0.020 0.552
Обтекание system
в новой функции rsync
:
rsync <- function (from, to, pattern = "") {
system(paste("rsync -outi", from, to, sep = " "), intern = TRUE)
}
system.time(rsync(from = '~/dir/files*', to = 'serverhost:'))
user system elapsed
0.040 0.030 3.825
Update
Снижение скорости вызвано ненужным использованием intern = TRUE
rsync <- function (from, to, pattern = "") {
system(paste("rsync -outi", from, to, sep = " "))
}
system.time(rsync(from = '~/dir/files*', to = 'serverhost:'))
user system elapsed
0.070 0.020 0.504