如果在R函数中使用全局变量,有没有办法抛出警告(并失败..)?我认为这样可以避免意外行为......例如
sUm <- 10
sum <- function(x,y){
sum = x+y
return(sUm)
}
Run Code Online (Sandbox Code Playgroud)
由于"拼写错误"的回报,该功能将永远返回10.而不是返回sUm它的值应该失败.
我的另一个答案更多的是你可以在你的功能中采取什么方法.现在,我将提供一些关于定义函数后要做什么的见解.
要确保您的函数不应该使用全局变量,请使用该codetools包.
library(codetools)
sUm <- 10
f <- function(x, y) {
sum = x + y
return(sUm)
}
checkUsage(f)
Run Code Online (Sandbox Code Playgroud)
这将打印消息:
<anonymous> local variable ‘sum’ assigned but may not be used (:1)
要查看函数中是否使用了任何全局变量,可以将findGlobals()函数的输出与全局环境中的变量进行比较.
> findGlobals(f)
[1] "{" "+" "=" "return" "sUm"
> intersect(findGlobals(f), ls(envir=.GlobalEnv))
[1] "sUm"
Run Code Online (Sandbox Code Playgroud)
这告诉你全局变量sUm在内部使用的f()时候可能不应该使用.
没有办法永久地改变变量的解析方式,因为这会破坏很多功能.在许多情况下,您不喜欢的行为实际上非常有用.
如果在函数中找不到变量,R将检查为这样的变量定义函数的环境.您可以使用该environment()功能更改此环境.例如
environment(sum) <- baseenv()
sum(4,5)
# Error in sum(4, 5) : object 'sUm' not found
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为baseenv()指向空的"基础"环境.但请注意,您无法使用此方法访问其他功能
myfun<-function(x,y) {x+y}
sum <- function(x,y){sum = myfun(x+y); return(sUm)}
environment(sum)<-baseenv()
sum(4,5)
# Error in sum(4, 5) : could not find function "myfun"
Run Code Online (Sandbox Code Playgroud)
因为在诸如R之类的函数语言中,函数只是常规变量,它们也在定义它们的环境中作用域,并且在基础环境中不可用.
您将手动更改您编写的每个函数的环境.同样,没有办法更改此默认行为,因为包中定义的许多基本R函数和函数都依赖于此行为.