gpt4 book ai didi

R 强制本地范围

转载 作者:行者123 更新时间:2023-12-04 16:58:05 26 4
gpt4 key购买 nike

这可能不是正确的术语,但希望我能理解我的观点。

我经常最终做这样的事情:

myVar = 1
f <- function(myvar) { return(myVar); }
# f(2) = 1 now

R 愉快地使用了函数范围之外的变量,这让我摸不着头脑,想知道我怎么可能得到我现在的结果。

是否有任何选项说“强制我只使用以前在此函数范围内分配过值的变量”? Perl 的 use strict例如,做这样的事情。但我不知道 R 有一个等效的 my .

编辑:谢谢,我知道我以不同的方式将它们大写。确实,这个例子是专门为了说明这个问题而创建的!

我想知道当我这样做时,是否有一种方法可以让 R 自动警告我。

编辑 2:此外,如果 Rkward 或其他 IDE 提供此功能,我也想知道。

最佳答案

据我所知,R 不提供“使用严格”模式。所以你有两个选择:

1 - 确保所有“严格”功能都没有 globalenv 作为环境。您可以为此定义一个很好的包装函数,但最简单的方法是调用 local :

# Use "local" directly to control the function environment
f <- local( function(myvar) { return(myVar); }, as.environment(2))
f(3) # Error in f(3) : object 'myVar' not found

# Create a wrapper function "strict" to do it for you...
strict <- function(f, pos=2) eval(substitute(f), as.environment(pos))
f <- strict( function(myvar) { return(myVar); } )
f(3) # Error in f(3) : object 'myVar' not found

2 - 进行代码分析,警告您“不良”用法。

这是一个函数 checkStrict希望可以满足您的需求。它使用了优秀的 codetools包裹。
# Checks a function for use of global variables
# Returns TRUE if ok, FALSE if globals were found.
checkStrict <- function(f, silent=FALSE) {
vars <- codetools::findGlobals(f)
found <- !vapply(vars, exists, logical(1), envir=as.environment(2))
if (!silent && any(found)) {
warning("global variables used: ", paste(names(found)[found], collapse=', '))
return(invisible(FALSE))
}

!any(found)
}

并尝试一下:
> myVar = 1
> f <- function(myvar) { return(myVar); }
> checkStrict(f)
Warning message:
In checkStrict(f) : global variables used: myVar

关于R 强制本地范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15360730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com