为什么R不能用给定值替换函数参数?

时间:2019-12-24 18:27:25

标签: r function

我写了这个简单的函数来安装和导入库(如果尚未安装)。这是我的代码:

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试图求值而不是求函数调用时使用的实际值?

2 个答案:

答案 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)
   }
}