[英]How to use purrr::map to base::assign?
如何从喵喵叫到咕噜咕噜?
假设我有一个包含 2 个元素“a”和“b”的列表。 我想将这些元素复制到我的全局环境中。 如果我只想将这些元素添加到搜索路径中,我会使用assign。 但是,我想创建一个副本。 我想使用 purrr::map 来做到这一点。 它是如何工作的?
mylist <- list(a=1:2, b=3:4)
#nope
map(mylist, assign, x=names(.), value=.)
#no
map(mylist, assign(x=names(.), value=.))
#no
map2(mylist, names(mylist), assign(x=.y, value=.x) )
#no
map2(mylist, names(mylist), assign, x=.y, value=.x )
对此的几个回应:-)
别。 我的第一个发自内心和强调的回应:不要那样做。 我很少发现使用get
/ assign
是合理的,最常见的是它们表明数据管理效率低下(如果不是差的话)。 在list
具有相似结构的事物意味着您可以有效地对它们进行操作(使用map
或lapply
或类似方法)。
Base R 使用list2env
非常有效地做到了这list2env
。
ls() # character(0) list2env(list(a=1:2, b=3:4), envir = .GlobalEnv) # <environment: R_GlobalEnv> ls() # [1] "a" "b"
如果您必须使用purrr
,那么您需要的是名称和值,因此请使用purrr::imap
:
ls() # character(0) imap(list(a=1:2, b=3:4), ~ assign(..2, ..1, envir = .GlobalEnv)) # $a # [1] 1 2 # $b # [1] 3 4 ls() # [1] "a" "b"
您的assign
调用失败的原因是它将它分配给当时的环境,这既不是全局的,也不是您在调用map
/ map2
后可以使用的。
更容易的是来自base R
list2env
直接应用于命名list
以从全局环境中的names
创建对象
list2env(mylist, .GlobalEnv)
关于map
的使用,它只返回值而不返回names
与此主题稍微相关的是解构赋值。 在R
,这可以通过zeallot
%<-%
操作符来zeallot
library(zeallot)
c(a, b) %<-% mylist
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.