我希望通过将函数名存储在列表中来从已卸载的包中调用函数。
通常我会使用
>>> 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列表。
答案 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>