在R中使用波浪符(~)和句点(.)
在R中使用波浪符(~)和句点(.)
我正在学习使用tidyverse和purrr进行循环处理,使用Hadley的R4DS书籍,对于波浪线~符号和句点符号的确切用法有些困惑。
所以在编写for循环或使用map()时,可以使用波浪线~代替写出function()。
这只适用于for循环吗?
所以如下所示...
models <- mtcars %>% split(.$cyl) %>% map(~lm(mpg ~ wt, data = .))
此外,我被告知句点可以用于“引用当前列表元素”。但是我不明白这是什么意思。这是否意味着,只有在循环时,句点才表示正在循环的列表中的元素?它与管道有何不同?在使用管道时,将一行代码的结果传递到下一行。
所以在上面的示例中,mtcars通过split()传递到第二行,但使用了一个句点。为什么?
下面的示例总结了我的困惑:
x <- c(1:10) detect(x, ~.x > 5)
使用detect函数,它找到第一个匹配项,我以为我可以直接使用
detect(x, x >5)
但是我收到一个错误,说x >5不是一个函数。所以我添加了一个波浪线
detect(x, ~ x > 5)
然后收到一个错误,说它期望一个单一的TRUE或FALSE,而不是10。所以如果添加一个句点
detect(x, ~.x >5)
突然之间它像循环一样工作。那么在这里,~和.的关系/用法是什么,.如何与简单的管道比较?
在R中,波浪号(~)和句点(.)的使用是为了使代码更简洁和易读。波浪号(~)在tidyverse
中的非标准评估(NSE)中被用作函数的表示。它自动将每个参数分配给特殊符号.x
、.y
和..1
、..2
、..3
。句点(.)在函数内部表示当前参数的值。
使用波浪号(~)和句点(.)可以使代码更简洁,尤其在有多个变量时。它们可以用于各种函数,例如map
和pmap
。在map
中,句点(.)表示当前参数的值,而在pmap
中,特殊符号..1
表示第一列的值。
然而,需要注意的是,map
只能接受一个列表或向量作为参数,而不能使用map(mtcars, 1, 2, ~ )
这种方式。在这种情况下,你可以使用pmap
。
总之,使用波浪号(~)和句点(.)可以使代码更简洁和易读,特殊符号.x
、.y
和..1
、..2
、..3
可以帮助我们快速引用参数的值。