r - 什么时候使用“with”功能,为什么好呢?

标签 r syntax keyword

使用with()有什么好处?它在帮助文件中提到它在根据数据创建的环境中评估表达式。这有什么好处?与仅在全局环境中进行评估相比,创建环境并在其中进行评估是否更快?还是我还缺少其他东西?

最佳答案

with是没有data参数的函数的包装

有许多函数可用于数据框并带有data参数,因此您不必在每次引用列时都重新输入数据框的名称。 lmplot.formulasubsettransform只是几个示例。

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)


但是,如果(出于某种奇怪的原因)我们想要找到meancyl + 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_namedata_name[, "column_name"]

何时使用with

只要您愿意(在R控制台中)和在R脚本中进行交互,都可以使用with来保存键入内容并使代码更清晰。您需要为单个命令重新输入数据框名称的频率越高(并且您的数据框名称越长!),使用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.framestransform也很好。)

包装内

不要在R包中使用withhelp(subset)中有一个警告可能也适用于with


警告这是旨在交互使用的便利功能。对于编程,最好使用诸如[之类的标准子集函数,尤其是参数子集的非标准评估会产生意想不到的后果。


如果使用with构建R包,则在检查它时,可能会收到有关使用无可见绑定的变量的警告或说明。这将使CRAN无法接受该软件包。

with的替代品

不要使用attach

许多(大多是过时的)R教程都使用attach来避免使全局环境可以访问列,从而避免重新键入数据框名称。 attach is widely considered to be bad practice and should be avoided。附加的主要危险之一是,如果分别修改数据列,则它们可能会变得不同步。 with避免了这种陷阱,因为它一次被调用一个表达式。关于Stack Overflow的问题很多,新用户遵循旧教程并由于attach而遇到问题。简单的解决方案是始终不使用attach

一直使用with似乎太重复了

如果要执行许多数据操作步骤,您可能会发现自己以with(my_data, ...开始每一行代码。您可能会认为这种重复几乎和不使用with一样糟糕。 data.tabledplyr软件包都提供了具有非重复语法的有效数据操作。我鼓励您学习使用其中之一。两者都有出色的文档。

关于r - 什么时候使用“with”功能,为什么好呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42283479/

相关文章:

php - 使用 radio select php 更新 mysql

c++ - 参数前的 "class"是什么意思?

python - 如何在 Python 中用补码表示二进制文字?

php - MySQL - 使用 OR 时如何知道哪个字段与结果匹配

Java 相当于数据库 IN

r - 仅当 df1 中的行 ID 值也存在于 df2 中时才追加行

r- rollapply 跨多个文件数据库

r - R Shiny中文件上传的默认值

r - 如何 : Automatically set fixed coordinate ratio (coord_fixed) when x- and y-axis are on different scales?

javascript - Sublime Javascript 关键字突出显示