非标准评估设置名称R

时间:2019-04-29 18:17:30

标签: r purrr nse quosure

我试图重复调用一个函数(特别是Seurat :: DimPlot),其中一个参数是命名列表(cells.highlight)。我打算使用purrr::imap进行通话。我有一个命名列表,其中列表的每个元素都是字符的向量。我想为Seurat :: DimPlot的cells.highlight参数创建列表。当我尝试

imap(mylist, ~ DimPlot(seurat_obj, cells.highlight=list(.y=.x), cols="lightgrey", 
  cols.highlight="dodgerblue")  )

该图看起来不错,但不是将变量.y替换为列表元素名称,而是将列表元素名称保留为“ .y”。 (因此在剧情中,我在图例中看到“ .y”)。制作SSCE

dp <- function(name, values){
   list(name = values)
}
dp("a",paste0("a",1:3))
# $name
# [1] "a1" "a2" "a3"

我想要的地方

$a
[1] "a1" "a2" "a3"`

我已经尝试使用enquo,as_name,':=',ensym,quote,但是我似乎无法正确理解。我知道您可以使用list [[name]] = ...将其分成两行,但是由于这是一个较大问题的一部分,所以我很想学习如何适当地引用和取消引用变量名。

即使阅读,重新阅读和重新阅读Hadley Wickhams的Advanced-R chapter on quasiquotations和他的chapter on evaluation,我在使用NSE时也总是遇到困难,但是看起来所有这些在那,我只是不能把它们放在一起

1 个答案:

答案 0 :(得分:2)

由于您是purrr用户,因此应使用set_names设置列表名称

imap(mylist, ~ DimPlot(seurat_obj, cells.highlight=set_names(list(.x), .y), cols="lightgrey", 
  cols.highlight="dodgerblue")  )

dp为例,应该是

dp <- function(name, values){
  set_names(list(values), name)
}
dp("a",paste0("a",1:3))
# $`a`
# [1] "a1" "a2" "a3"

因此,在这种情况下,这实际上与非标准评估无关。这只是为工作使用正确的功能。