在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'变量具有相同的值
如果没有这种能力,我就无法使用与列名相同的参数编写函数。
答案 0 :(得分:1)
感谢@ HaddE.Nuff,我想出了这个;
instateFails <- function(state) {
args <- environment()
subset(df, state == args$state)
}
在拨打电话之前捕获当前环境,这样您就可以在调用函数中引用所有本地人。然后参考过滤器表达式中的环境变量。