作者:a13786812476 | 来源:互联网 | 2023-02-11 16:34
使用有什么好处with()
?在帮助文件中,它提到它在从数据创建的环境中评估表达式.这有什么好处?创建环境并在那里评估它是否更快,而不是仅仅在全球环境中评估它?或者还有其他我想念的东西?
1> Gregor..:
with
是没有data
参数的函数的包装器
有许多函数可以处理数据框并采用data
参数,因此每次引用列时都不需要重新键入数据框的名称.lm
,plot.formula
,subset
,transform
都只是几个例子.
with
是一个通用的包装器,让你使用任何函数,就好像它有一个数据参数.
使用mtcars
数据集,我们可以使用或不使用data参数来拟合模型:
# this is obviously annoying
mod = lm(mtcars$mpg ~ mtcars$cyl + mtcars$disp + mtcars$wt)
# this is nicer
mod = lm(mpg ~ cyl + disp + wt, data = mtcars)
但是,如果(对于一些奇怪的原因),我们想找到mean
的cyl + disp + wt
,还有一个问题,因为mean
没有一个数据参数一样lm
呢.这是with
解决以下问题:
# without with(), we would be stuck here:
z = mean(mtcars$cyl + mtcars$disp + mtcars$wt)
# using with(), we can clean this up:
z = with(mtcars, mean(cyl + disp + wt))
包裹foo()
在with(data, foo(...))
让我们使用任何功能foo
,就好像它有一个data
说法-这是说我们可以用不带引号的列名,防止重复data_name$column_name
或data_name[, "column_name"]
.
何时使用 with
使用with
的交互并在[R脚本来节省打字,使您的代码更清晰.您需要为单个命令重新键入数据框名称的频率越高(数据帧名称越长!),使用的好处就越大with
.
另请注意,with
不限于数据帧.来自?with
:
对于默认with
方法,这可以是环境,列表,数据框或整数,如sys.call
.
我不经常使用环境,但是当我这样做时,我发现with
非常方便.
当您只需要一行结果时
正如@Rich Scriven在评论中所建议的那样,with
当您需要使用类似的结果时,它会非常有用rle
.如果您只需要一次结果,那么他的示例 with(rle(data), lengths[values > 1])
允许您rle(data)
匿名使用结果.
什么时候避免 with
当有是一个data
说法
许多具有data
参数的函数在调用它时不仅仅使用它更简单的语法.大多数建模功能(如lm
),以及许多其他(ggplot
!)使用提供的功能做了很多data
.如果您使用with
,而不是一的data
说法,你会限制功能提供给您.如果有data
参数,请使用data
参数,而不是with
.
添加到环境中
在上面的示例中,结果已分配给全局环境(bar = with(...)
).要进行分配的内部列表/环境/数据,你可以使用within
.(在这种情况下data.frames
,transform
也很好.)
在包中
不要with
在R包中使用.有一个警告help(subset)
,可以适用于with
:
警告这是一个便于交互使用的便利功能.对于编程,最好使用标准的子集函数[
,特别是参数子集的非标准评估可能会产生意想不到的后果.
如果使用构建R包with
,当您检查它时,您可能会收到有关在没有可见绑定的情况下使用变量的警告或注释.这将使CRAN无法接受包.
替代品 with
不要用 attach
许多(大多数是过时的)R教程用于attach
避免通过使列可访问全局环境来重新键入数据框名称.attach
被广泛认为是不好的做法,应该避免.附加的主要危险之一是,如果单独修改数据列,则数据列可能会不同步.with
避免这个陷阱,因为它一次调用一个表达式.Stack Overflow上有很多很多问题,其中新用户正在关注旧教程并因此而遇到问题attach
.简单的解决方案始终不使用attach
.
一直使用with
似乎太重复了
如果您正在执行许多数据操作步骤,您可能会发现自己开始使用每行代码with(my_data, ...
.你可能会认为这种重复几乎和不使用一样糟糕with
.无论是data.table
和dplyr
封装提供非重复的语法高效的数据处理.我鼓励你学会使用其中一个.两者都有出色的文档.
使用`rle`时它也非常有用.您可以访问值而无需分配`rle`.示例:`with(rle(data),lengths [values> 1])`.无论如何,我发现它非常有用.
2> MrFlick..:
当我不想继续打字的时候我会用它dataframe$
.例如
with(mtcars, plot(wt, qsec))
而不是
plot(mtcars$wt, mtcars$qsec)
前者查找wt
并qsec
在mtcars
data.frame中查找.当然
plot(qsec~wt, mtcars)
更适合用于参数的情节或其他功能data=
.