我试图重复调用一个函数(特别是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时也总是遇到困难,但是看起来所有这些在那,我只是不能把它们放在一起
答案 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"
因此,在这种情况下,这实际上与非标准评估无关。这只是为工作使用正确的功能。