我正在构建一个在调用代码中使用名为q的变量的函数,并返回q * log(.. some number ..)。 在会话中创建此功能时,它可以很好地工作,但是在将包加载到另一个会话后创建具有此功能的包时,它不起作用。这是一个简化的例子
在R:
>myfunc <- function() return(q * log(2.0))
>q=1.0
>myfunc()
[1] 1.386294
>package.skeleton(list=c("myfunc"),name="mypckg")
在R
中再次构建和安装包之后> library(mypckg)
> q = 3.0
> myfunc()
Erreur dans q * log(2) : argument non numérique pour un opérateur binaire
如果我将变量的名称从q修改为qq或任何其他名称,一切都会完美无缺。
任何人都可以解释发生了什么。 q是一些保留名称是R中的一些已知错误吗?
答案 0 :(得分:1)
当您将函数包装在一个包中时,它将存在于另一个环境中,而不是包含该包的其余代码。因此,myfunc
正在为q
搜索一组不同的环境,而不是您的变量,它会找到base::q
,这是一个函数。
解决方案不是访问函数中的全局变量。而是使用参数:
myfunc <- function (q) q * log(2.0)
答案 1 :(得分:1)
如果你想在重用函数时使用'q'值,你有两个选择:在参数列表中使用它或在函数体中定义它以便保存它。
myfunc <- function(q=1.0) return(q * log(2.0))
myfunc()
或者:
myfunc <- function() {q<-1.0; q * log(2.0) } # less flexible definition of q
myfunc()
JörgMäder的评论指出错误消息表明它确实找到了'q',而不是在命名数据对象列表中,而是在命名函数列表中。