2011-06-09 105 views
22

我想创建一个函数,其中包括加载函数内的一个包。一个简短的例子(不运行!):从字符串中加载R包

loadMe <- function(name){ 
    genLib(xxx, libName = name) #make a new library with name "name" 
    library(name)    #load the new library... 
} 

这是行不通的!可重复的代码有点这说明我的主要问题:

library(ggplot)   #this works fine 
load.this <- "ggplot" 
library(load.this)  #I want this to load ggplot! 

我知道这个问题是library()require()当作参数,其尚不存在的对象名称。我已经试过包装我的字符串,parse()deparse()substitute()expression()quote(),等等等等,这些都返回了同样的问题:

library(load.this) 
# Error in library(loadss) : there is no package called 'loadss' 
library(deparse(load.this)) 
# Error in library(deparse(loadss)) : 'package' must be of length 1 

有没有办法做到这一点?

+0

如果您看看库('?library')的帮助,那么您得到了(在参数部分中):''package'作为名称给出的包的名称或文字字符串或字符串,具体取决于“character.only”是否为“FALSE”(默认)或“TRUE”。 – Marek 2011-06-09 10:54:39

回答

32

使用character.only参数

foo <- "ggplot2" 
library(foo,character.only=TRUE) 
0

你说,你已经使用parse()尝试。以下内容似乎适用于我:

eval(parse(text = 'library(MASS)')[1]) 
+2

避免解析。使用替代替代 – hadley 2011-06-09 14:18:40

+0

@hadley:为什么要避免'parse'?如何在这种情况下获得“替代品”以取得相同的结果?当我不知道事先知道哪个库应该被加载时,我正在考虑这种情况,尽管我可能会把它作为一个文本字符串。 – nullglob 2011-06-14 09:22:29

+4

您始终想要使用提供问题最佳表示的对象类型。要使用替代品你会这样做:'替代(库(pkg),列表(pkg = as.name(“MASS”)))' – hadley 2011-06-14 14:30:22