Вы не можете включать ::
в строке, поскольку ::
является функцией. Эта строка не оценивается и не анализируется. 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)))
Попробуйте без '" 'кавычки. – Frank
@Frank нет кости. Дело в том, тха t аргумент 'what' для' do.call' принимает строку символов, и я манипулирую значение этой строки –
Ок, я не lmer, но это похоже на работу: 'do.call (getFromNamespace (" rleid "," data.table "), list (c (1,1), 1: 2))' Gotta сломать вашу строку в ее составные части, хотя (функция, затем пакет). – Frank