2015-12-18 1 views
0

Мне надоело запускать свои скрипты с require(data.table); require(ggplot2) и т. Д. Я знаю, что могу сделать что-то вроде lapply(c('data.table', 'ggplot2'), require, character.only=T), но он просто вернет предупреждение (а не ошибку) для недостающий пакет, плюс мне нужна моя собственная функция require_mult(...), чтобы мои сценарии были чище. Так что я написал функцию:функция для загрузки нескольких пакетов с вводом как несимвольный список

require_mult <- function(...){ 
    arg_list <- list(...) 
    if(any(!sapply(arg_list, is.character))) stop('require_mult must have character arguments') 
    check <- tryCatch({pkg_array <- unlist(arg_list) 
         loaded <- sapply(pkg_array, require, character.only=TRUE, quietly=TRUE) 
         message('Loaded packages: ', 
           paste(pkg_array, collapse=', ')) }, 
         warning = function(w) stop(w), # I want execution to halt if a package is missing 
         error = function(e) stop(e) 
         ) 
} 

который, кажется, работает по желанию (например, грузы для require_mult('data.table','ggplot2'), ошибки для require_mult('data.table','ggplotfoo')), но я хотел бы сделать эту работу require_mult(...) для character.only=FALSE. Я посмотрел на определение require, который использует

if (!character.only) 
     package <- as.character(substitute(package)) 

Но я не могу понять, как применить substitute поперек невычисленного выражение, которое действительно разделенный запятыми список.

Я знаю, что это приложение является довольно бессмысленным и академическим, но было бы обогатить свое понимание вычисления выражения R, если есть на самом деле способ написать require_mult, который может быть использован для require_mult(data.table, ggplot2) и т.д.

объяснения почему это не может быть сделано, также будет приемлемым.

+0

Вы не хотите использовать 'require' здесь - вы можете найти эту статью Yihui Се полезно: http://yihui.name/en/2014/07/library-vs-require/ – TARehman

+0

@ TARehman, я понял, что, но вы можете понять, как передать несколько имен пакетов в библиотеку? Это не работает: 'lapply (c ('data.table', 'ggplot2'), library, character.only = T)' Если вы можете предоставить решение с помощью 'library' всеми способами, пожалуйста, сделайте это. – C8H10N4O2

+0

Я считаю, что вы просто хотите 'do.call'. Вам определенно нужен список передаваемых пакетов, чтобы быть несимвольным? Я мог бы написать для этого функцию обертки. Или он должен поднять _error_, а не _warning_? – TARehman

ответ

1

Я здесь кое-что узнал! Вы можете использовать match.call для получения аргументов, переданных в ..., без их оценки. (Предположительно, вы могли бы сделать это с помощью названных аргументов ...? Мне нужно поэкспериментировать с этим.) Я использовал this answer для создания очень простой функции ниже. Как вы можете видеть, он ломается при достижении пакета, которого не существует.

Я думаю, вы могли бы использовать это для дальнейшего развития.

library_mult <- function(...) { 
    args <- match.call(expand.dots = FALSE)$`...` 
    for(x in args) { 

     x <- as.character(substitute(x)) 
     library(x,character.only = TRUE) 
    } 
} 

> library_mult(MASS,thisisnopack) 

Error in library(x, character.only = TRUE) : 
    there is no package called ‘thisisnopack’ 
+0

Это потрясающе. Я действительно думаю, что вы должны опубликовать его до [R-devel] (https://stat.ethz.ch/mailman/listinfo/r-devel) для включения в будущую версию базы R, поскольку способ загрузки нескольких библиотек по умолчанию утомительно. Благодаря! – C8H10N4O2

Смежные вопросы