2014-01-20 27 views
0

我想使用字符串将函数分配给变量。 base包中的get()函数确实是我想要的差不多。例如,使用R的`get()`函数,同时使用包的条件

valueReadFromFile <- "median" 
ds <- data.frame(X=rnorm(10), Y=rnorm(10)) 
dynamicFunction <- get(valueReadFromFile) 
dynamicFunction(ds$X) #Returns the variable's median. 

不过,我想其包资格的功能,所以,我不担心(一)与library()加载功能的包,或(b)调用错误的函数在不同的包装中。

是否有一个强大的,程序化的方式,我可以使用它的包使用get()(或某些类似的函数)来限定函数的名称?下面的代码不起作用,大概是因为get()不知道如何解释包名称::之前。

require(scales) #This package has functions called `alpha()` and `rescale()` 
require(psych) #This package also has functions called `alpha()` and `rescale()` 

dynamicFunction1 <- get("scales::alpha") 
dynamicFunction2 <- get("psych::alpha") 

回答

2

你也可以用字符值,或getExportedValue,这::内部使用

dynamicFunction1 <- `::`('scales', 'alpha') 
dynamicFunction2 <- `::`('psych', 'alpha') 

dynamicFunction1 <- getExportedValue('scales', 'alpha') 
dynamicFunction2 <- getExportedValue('psych', 'alpha') 
+0

谢谢@mnel。第一种方法完全避免“get()”很有趣。我想我会用第一种方式。我猜它可能会更健壮,因为它通过'substitute()'传递包和函数名。但这是一个非常不明智的猜测。 – wibeasley

+0

我很高兴你收录了第二种方法。 ''''里面的'substitute()'调用意味着我不能直接传递变量,但是这个工作原理是这样的: ''''x_label_split < - strsplit(“scales :: comma”,split =“::”)[[1 ]]'; 'getExportedValue(x_label_split [1],x_label_split [2])' – wibeasley

3

试试这个:

dynamicFunction1 <- get("alpha", envir=as.environment("package:scales")) 
dynamicFunction2 <- get("alpha", as.environment("package:psych")) 

术语的问题:我不会称之为dynamicFunction1一个 “变量”,而是一个 “名字”。实际上没有一个名为“变量”的正式类对象,但我通常会看到该术语用于数据对象,而“名称”是语言对象。

+0

感谢@IShouldBuyABoat直接调用::。这避免了我担心的碰撞,但只有在包已经加载的情况下才有效。 ......假设我没有犯错。 – wibeasley

+0

好吧,我正在带领您加载包装。如果你想在加载的同时进行加载状态的测试,那么通常的代码是'if(require(pkg)){do_something()}' –

+0

好点,@IShouldBuyABoat。我会再看看设计,并考虑这是否更合适。我喜欢你在说什么 - 我需要考虑是否需要将函数的包(A)加载到环境中,如果它尚未加载,或者(B)隐藏在全局环境中。 – wibeasley