函数中的return(q * log(..))返回错误

时间:2013-12-08 23:02:54

标签: r

我正在构建一个在调用代码中使用名为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中的一些已知错误吗?

2 个答案:

答案 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',而不是在命名数据对象列表中,而是在命名函数列表中。