我写了这个简单的函数来安装和导入库(如果尚未安装)。这是我的代码:
traverse f [1 .. n]
但是,当我运行函数时(在上述循环中)check_library <- function(my_lib){
tryCatch(
expr = {
library(my_lib)
},
error = {
install.packages(my_lib)
library(my_lib)
}
)
}
lista_libraries = list('tidyverse', 'rvest', 'bizdays','dplyr','lubridate')
for (k in lista_libraries) {
check_library(k)
}
打印以下R
:
Error message
我的意思是,Error in library(my_lib) : there is no package called ‘my_lib’
只是参数名称,为什么R试图求值而不是求函数调用时使用的实际值?
答案 0 :(得分:1)
如果可以保证my_lib将是一个字符串,则可以指定library(my_lib, character.only = TRUE)
。但是,如果您希望能够同时使用带引号和不带引号的库名(例如check_library(dplyr)
),则可以执行以下操作:
check_library <- function(my_lib)
{
package <- as.character(substitute(my_lib))
if (!(package %in% installed.packages()))
{
install.packages(package)
}
if (package %in% installed.packages())
{
library(package, character.only = TRUE)
}
}
答案 1 :(得分:0)
如果您不想弄乱tryCatch表达式,则可以从require函数获得相同的效果,该函数会加载该软件包(如果存在),否则返回FALSE
check_library <- function(x){
x <- as.character(substitute(x)) #will make sure x is converted to a string if it isn't already
if(!require(x, character.only = T)){
install.packages(x)
}
}