gpt4 book ai didi

R 强制局部范围

转载 作者:行者123 更新时间:2023-12-03 01:17:08 24 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 不提供“use strict”模式。所以你有两个选择:

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/6216968/

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