2016-08-16 14 views
1

Я хочу, чтобы do.call функция (из-за экспорта) из пакета. Имя функции - это строка символов, например "lme4::lmer".do.call функция в R без загрузки пакета

# 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

Попробуйте без '" 'кавычки. – Frank

+0

@Frank нет кости. Дело в том, тха t аргумент 'what' для' do.call' принимает строку символов, и я манипулирую значение этой строки –

+0

Ок, я не lmer, но это похоже на работу: 'do.call (getFromNamespace (" rleid "," data.table "), list (c (1,1), 1: 2))' Gotta сломать вашу строку в ее составные части, хотя (функция, затем пакет). – Frank

ответ

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))) 
+0

I ' ve никогда не использовал такую ​​аркану, как эти 'get *' s, но 'getFromNamespace' было тем, что рекомендовали Uwe Ligges десять лет назад: http://r.789695.n4.nabble.com/do-call-method-within-namespace- td797206.html – Frank

+1

@Frank Я просто посмотрел на источник '::' и сделал то, что он сделал. Я уверен, что это сработает. – MrFlick

+0

О, я думаю, ваш путь имеет больше смысла. Похоже, 'getFromNamespace' больше похож на' ::: '(также захватывает неэкспонированные забавы). – Frank