在R中,get()从一个未加载的包调用一个函数而不使用库

时间:2017-07-25 11:41:40

标签: r

我希望通过将函数名存储在列表中来从已卸载的包中调用函数。

通常我会使用

>>> ls4=[]
>>> for i in ls2:
...     ls3=ls1[i:]
...     for j in ls3:
...             if any(char.isdigit() for char in j):
...                     ls4.append(j)
...                     break
... 
>>> ls4
['4587125', '548H21']

但是因为在编写包时你不允许加载库我必须使用像

这样的东西
library(shiny)
pagelist <- list("type" = "p") # object with the function name (will be loaded from .txt file)
get(pagelist$type[1])("Display this text")

哪个不起作用。有没有办法从存储在列表中的函数名称调用函数,而无需加载库?请注意,应该可以调用许多不同的函数(全部来自同一个包),所以只需使用例如。

get(shiny::pagelist$type[1])("Display this text")

需要一个很长的if else statemens列表。

2 个答案:

答案 0 :(得分:2)

您不应像接受的答案那样使用getExportedValue,因为它的帮助页面将那里的功能描述为“内部功能,以支持对名称空间对象的反射”。使用内部函数是一种坏习惯,因为内部函数可以在很少通知的情况下以微妙的方式进行更改。

shiny::p"shiny"都是变量中的字符串时,等效于"p"的正确方法是使用get

get("p", envir = loadNamespace("shiny"))

loadNamespace函数返回包的导出环境;如果已经加载了包,执行起来会很快。

原始问题

  

有没有一种方法可以从存储在函数名称中调用函数   列表,而不必加载库?

(我认为“库”应为R行话中的“包”)。答案是“否”,除非加载了包,否则无法从包中获取任何对象。但是,加载比附加操作简单,因此不会将shiny放在搜索列表中(使所有shiny对用户可见),它只是在R内部加载。

一个相关的问题是为什么get("shiny::p")不起作用。答案是shiny::p是要求值的表达式,而get仅适用于名称。

答案 1 :(得分:1)

使用getExportedValue

getExportedValue("shiny",pagelist$type[1])("Display this text")
#<p>Display this text</p>