【问题标题】:Name of a list not the contents列表名称而不是内容
【发布时间】:2014-12-18 22:03:39
【问题描述】:

我有一个包含 18 个元素的列表,名为 bx2

我想在函数中使用bx2

XlsMaker  <- function(x) {
  library("XLConnect")
a  <- length(x)
b  <- paste0(x,".xlsx")
for (i in 1:a){
writeWorksheetToFile(b, data = x[[i]], sheet = names(x[i]))
}
}

但是当将 I bx2 放入函数时,它会拉入列表的所有元素,而不仅仅是列表的名称。

是否可以重写函数让b变成bx2.xlsx

【问题讨论】:

    标签: r


    【解决方案1】:

    b &lt;- paste0(x,".xlsx") 行是错误的。这会在对象x 本身上调用paste0,这根本不是您想要做的。您想在对象的 name 上调用它。

    这通常会引起一堆蠕虫,因为对象可以在两个不同的地方有两个不同的名称。考虑一下:在你的全局环境中名为bx2 的对象现在在函数的范围内被命名为x。如果您只想从顶层调用此函数(例如,用于交互使用),您可以安全地从父环境(调用函数的环境)获取对象的名称,方法是将该行替换为:

    x_name <- deparse(substitute(x))
    b <- paste0(x_name, ".xlsx")
    

    substitute 函数在父环境中获取x 的名称,作为特殊的name 对象。 deparse 函数将此 name 转换为长度为 1 的 character 向量。

    我说这只能在顶层安全使用的原因是substitute 如果不小心使用可能会返回令人惊讶或意外的结果。 Hadley Wickham 详细介绍了这一点 in his book

    【讨论】:

      【解决方案2】:

      我想你只是想解析参数名称

      XlsMaker  <- function(x) {
          varname  <- deparse(substitute(x))
          library("XLConnect")
          a  <- length(x)
          b  <- paste0(varname ,".xlsx")
          for (i in 1:a){
              writeWorksheetToFile(b, data = x[[i]], sheet = names(x[i]))
          }
      }
      bx2 <-list(1:3, 4:6)
      XlsMaker(bx2)
      

      【讨论】:

        猜你喜欢
        • 2018-10-05
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 2013-07-27
        相关资源
        最近更新 更多