R语言使用do.call调用带命名空间的屏蔽函数报错问题
解决do.call调用带命名空间的函数字符串问题
直接用do.call("ANOFA::count", ...)会报错,因为do.call的字符串参数只会在全局环境和默认搜索路径里找函数,不会解析::这种命名空间语法。下面是几种可行的解决方法:
方法1:拆分命名空间与函数名,从指定命名空间获取函数
把用户输入的字符串(比如"ANOFA::count")拆成包名和函数名两部分,再用get()从对应命名空间里取出函数对象,再传给do.call:
# 假设用户输入的函数字符串是myfunc myfunc <- "ANOFA::count" # 拆分字符串 func_parts <- strsplit(myfunc, "::")[[1]] # 从指定命名空间获取函数 target_func <- get(func_parts[2], envir = asNamespace(func_parts[1])) # 调用do.call do.call(target_func, list(c(1,2,3)))
方法2:用eval+parse将字符串转为函数对象
如果不想拆分字符串,可以直接解析字符串得到函数对象,再传入do.call:
myfunc <- "ANOFA::count" target_func <- eval(parse(text = myfunc)) do.call(target_func, list(c(1,2,3)))
注意:如果用户输入的字符串不可控,这种方法有安全风险,但如果是可信输入的话完全没问题。
方法3:直接传递函数对象(如果场景允许)
如果不是必须用字符串传入,也可以直接把ANOFA::count作为函数对象传给do.call,这是最直接的方式:
do.call(ANOFA::count, list(c(1,2,3)))
另外,如果你想获取某个命名空间对应的环境,用asNamespace("ANOFA")就能得到ANOFA包的命名空间环境,用ls(asNamespace("ANOFA"))可以查看里面的所有对象。
内容的提问来源于stack exchange,提问作者Denis Cousineau
相关产品推荐
相关产品推荐

