我想从包中do.call
一个(导出的)函数。函数名称是一个字符串,如"lme4::lmer"
。
# Works, but not what I need
library(lme4)
do.call("lmer", ...)
# Also works, but not what I need
lme4::lmer(...)
# Doesn't work:
do.call("lme4::lmer", ...)
答案 0 :(得分:6)
您不能在字符串中包含::
,因为::
是一个函数。不评估和解析该字符串。 do.call
只是假定存在该名称的函数。就像::
一样,$
也是一个函数,所以这不起作用
a<-list(f=function(x) x+1)
do.call(a$f, list(4))
# [1] 5
do.call("a$f", list(4))
# Error in do.call("a$f", list(4)) : could not find function "a$f"
如果您希望能够从命名空间中查找函数,可以编写一个辅助函数,在函数包含::
getfun<-function(x) {
if(length(grep("::", x))>0) {
parts<-strsplit(x, "::")[[1]]
getExportedValue(parts[1], parts[2])
} else {
x
}
}
getfun("lme4::lmer")
这应该有效
do.call(getfun("lme4::lmer"), list(
Reaction ~ Days + (Days | Subject),
quote(lme4::sleepstudy)))
答案 1 :(得分:2)
do.call(eval(parse(text="lme4::lmer")), ...)
带解析的eval会起作用!
> tmp <- expand.grid(letters[1:2], 1:3, c("+", "-"))
> do.call(eval(parse(text='stringr::str_c')), c(tmp, sep = ""))
[1] "a1+" "b1+" "a2+" "b2+" "a3+" "b3+" "a1-" "b1-" "a2-" "b2-" "a3-" "b3-"
参考:https://www.r-bloggers.com/converting-a-string-to-a-variable-name-on-the-fly-and-vice-versa-in-r/