Альтернативы системе() в 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