R中的范围,并处理'与'

时间:2016-04-20 01:07:55

标签: r scoping

在R中,有很多情况下with似乎用来帮助你编写更短的代码;但是,这会掩盖现有符号,如局部变量和函数参数。有没有办法在不重命名的情况下引用它们,这样它们就不会与您的数据发生冲突?

例如,在此框架中,我有一个state列;

df <- data.frame(
  label=c("a", "b", "c"),
  state=c("off","on","off"))

我可以用.state参数编写过滤函数,过滤器可以工作;

instateWorks <- function(.state) {
  subset(df, df$state == .state)
}

# correct - 1 observation for "b"
onWorks <- instateWorks("on") 

但如果我给我的函数一个合理的参数名称,就会出现问题而且符号state似乎是指数据框的列;

instateFails <- function(state) {
  subset(df, df$state == state)
}

# fails - all 3 observations
onFails <- instateFails("on") 

有没有办法确定state应该表示参数,以使脚本按预期工作?

编辑 - 澄清为什么'with'和'eval'是我正在努力解决的问题,请考虑这段代码;

df <- data.frame(
  label=c("a", "b", "c"),
  state=c("off","on","off"))

with(df, state == "on")
# FALSE TRUE FALSE

state <- on
with(df, state == state)
# TRUE TRUE TRUE

在上一个with语句中,我正在寻找一种方法来表达'告诉我DF中哪些行具有'state'变量与上面一行中定义的'state'变量具有相同的值

如果没有这种能力,我就无法使用与列名相同的参数编写函数。

1 个答案:

答案 0 :(得分:1)

感谢@ HaddE.Nuff,我想出了这个;

instateFails <- function(state) {
  args <- environment()
  subset(df, state == args$state)
}

在拨打电话之前捕获当前环境,这样您就可以在调用函数中引用所有本地人。然后参考过滤器表达式中的环境变量。