【问题标题】:Non standard evaluation setting names R非标准评估设置名称 R
【发布时间】:2019-09-18 09:35:08
【问题描述】:

我试图重复调用一个函数(特别是 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]]=... 的东西把它分成两行,但是因为这是一个更大的问题的一部分,我很想学习如何正确地引用和取消引用变量名。

我一直在使用 NSE 时遇到问题,即使在阅读、重新阅读和重新阅读 Hadley Wickhams 的 Advanced-R chapter on quasiquotations 和他的 chapter on evaluation 之后,但似乎所有部分都在那里,我就是不能把它们放在一起

【问题讨论】:

    标签: r purrr nse quosure seurat


    【解决方案1】:

    由于您使用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"
    

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

    【讨论】:

    • 我真的很讨厌我如此专注于以一种方式看待问题而错过了一个明显的答案。我想当你唯一的工具是一把锤子时,一切都开始像钉子了。感谢您提供新工具!
    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多