R中的%<-%运算符是什么?

3
我在这篇博客https://blogs.rstudio.com/ai/posts/2019-09-30-bert-r/ 中发现了一个新的管道R运算符%<-%code>,它在tokenize_fun()函数中使用。这个运算符叫什么?它是用来做什么的?尽管我知道其他的管道操作符如%>% %T>% %$%,但在谷歌上找不到任何关于它的信息。

它将左边的内容赋值给右边。我不确定它的名字是什么。 - NelsonGon
2个回答

4

这是来自于zeallot的多重赋值运算符。

%<-% 和 %->% 会隐式返回值。

这些运算符主要用于它们的赋值副作用。%<-% 和 %->% 会分配到它们被计算的环境中。

也就是说,它可以通过一行代码创建多个对象。

> library(zeallot)
> c(x, y, z) %<-% c(1, 3, 5)
> x
[1] 1
> y
[1] 3
> z
[1] 5

2

如果查看链接帖子中的代码,就可以清楚地看到这个运算符的作用。让我们来看一下tokenize_fun中的第一行:

tokenize_fun = function(dataset) {
  c(indices, target, segments) %<-% list(list(),list(),list())


那行代码实际上在一个主列表中创建了三个空列表,用于存储索引、目标和段落。这些列表稍后通过append被填充。
编辑:下面有一个关于函数特定名称的答案。我将保留这个答案,以防它可能提供一些额外的上下文。
通常,可以使用%. %`形式定义一个中缀运算符。在这种情况下,作者可能想通过一行代码“模拟”像Python中的多重赋值。

1
有趣。我尝试了以下代码:c(indices, target, segments) %<-% c(list(),list(),list()),它报错了。但是用c(indices, target, segments) %<-% list(list(),list(),list())却可以运行。 - tushaR
我在手机上,得回头在电脑上查一下。也许是因为你不能把列表存储在向量内?(我从来没有尝试过) - NelsonGon
2
c(list(), list(), ...) simplifies to list(), similar to c(list(), NULL, NULL, ...) - rawr
1
@rawr:没错。c(a,b)%<-%c(list(2),list(3)) 完全可以正常工作。R 以及它的怪癖。 - tushaR
1
c(list(1:2),list(1:3))list(1L,2L,1L,2L,3L) 不相同。 - rawr
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接