R 何时使用';与';功能和为什么它是好的?

R 何时使用';与';功能和为什么它是好的?,r,syntax,keyword,R,Syntax,Keyword,将与()一起使用有什么好处?在帮助文件中,它提到它在根据数据创建的环境中计算表达式。这有什么好处?创建环境并在其中进行评估是否比在全球环境中进行评估更快?或者我还遗漏了什么?当我不想继续键入dataframe$时,我会使用它。比如说 with(mtcars, plot(wt, qsec)) 而不是 plot(mtcars$wt, mtcars$qsec) 前者在mtcarsdata.frame中查找wt和qsec。当然 plot(qsec~wt, mtcars) 更适合于采用数据=参数的绘

与()一起使用有什么好处?在帮助文件中,它提到它在根据数据创建的环境中计算表达式。这有什么好处?创建环境并在其中进行评估是否比在全球环境中进行评估更快?或者我还遗漏了什么?

当我不想继续键入
dataframe$
时,我会使用它。比如说

with(mtcars, plot(wt, qsec))
而不是

plot(mtcars$wt, mtcars$qsec)
前者在
mtcars
data.frame中查找
wt
qsec
。当然

plot(qsec~wt, mtcars)
更适合于采用
数据=
参数的绘图或其他函数。

with
是无
数据
参数函数的包装器 有许多函数处理数据帧,并采用
data
参数,因此每次引用列时都不需要重新键入数据帧的名称<代码>lm
绘图。公式
子集
变换
只是几个例子

with
是一个通用包装器,允许您使用任何函数,就好像它有一个数据参数一样

使用
mtcars
数据集,我们可以拟合带有或不带有数据参数的模型:

# 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)
但是,如果(出于某种奇怪的原因)我们想要找到
cyl+disp+wt
mean
,那么会出现问题,因为
mean
没有像
lm
那样的数据参数。这是
解决的问题:

# 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))
用(data,foo(…)在
中包装
foo()
可以让我们像使用
data
参数一样使用任何函数
foo
,也就是说,我们可以使用不带引号的列名,防止重复的
数据名$column\u名
数据名[,“column\u名”]

何时将
无论何时,只要您愿意以交互方式(R控制台)和R脚本使用
,即可保存键入内容并使代码更清晰。为单个命令重新键入数据框名称的频率越高(数据框名称越长!),将
一起使用的好处就越大

还要注意的是,带有
并不限于数据帧。从
?到

对于默认的
with
方法,这可能是一个环境、一个列表、一个数据帧或一个整数,如
sys.call

我不经常使用环境,但当我使用时,我发现使用
非常方便

当您只需要一行的结果片段时 正如@Rich Scriven在评论中所建议的那样,
with
在需要使用类似
rle
的结果时非常有用。如果您只需要一次结果,那么他的示例
with(rle(数据),length[values>1])
允许您匿名使用
rle(数据)
结果

何时使用
当存在
数据
参数时 许多具有
data
参数的函数在调用它时使用它不仅仅是为了更简单的语法。大多数建模函数(如
lm
)以及其他许多函数(
ggplot
!)都对提供的
数据进行了大量处理。如果将
一起使用,而不是使用
数据
参数,则会限制可用的功能如果存在
数据
参数,请使用
数据
参数,而不是
一起使用

添加到环境中 在上面的示例中,结果被分配到全局环境(
bar=with(…)
)。要在列表/环境/数据中进行分配,可以在
中使用
。(对于
数据帧
变换
也很好。)

打包 在R软件包中,不要将
一起使用。
帮助(子集)
中有一个警告,它几乎同样适用于

警告这是一个方便的功能,旨在交互使用。对于编程,最好使用标准的子集函数,如
[
,尤其是参数子集的非标准求值可能会产生意想不到的结果

如果您使用带
构建一个R包,当您检查它时,您可能会收到关于使用没有可见绑定的变量的警告或注释。这将使该包不被CRAN接受

使用
不要使用
attach
许多(大部分是过时的)R教程使用
attach
避免通过使列可供全局环境访问而重新键入数据框名称。attach的主要危险之一是,如果单独修改数据列,它们可能会变得不同步。
with
避免了这一陷阱,因为它一次调用一个表达式。有很多,男人在堆栈溢出问题上,新用户正在遵循旧教程,并且由于
attach
而遇到问题。简单的解决方法是始终不要使用
attach

一直使用
似乎太重复了

如果您正在执行许多数据操作步骤,您可能会发现自己的每一行代码都以
with开头(my_data,…
。你可能会认为这种重复几乎和不使用
一样糟糕。
data.table
dplyr
软件包都提供了高效的数据操作,语法不重复。我鼓励你学习使用其中的一种。它们都有很好的文档。

主要是为了在使用时节省击键次数有一个很长的数组名称。但这是离题的,因为许多好的问题都会根据专家经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定的专业知识。不要删除。社区将通过投票和参与来决定。@Ben