列表的名称不是内容

时间:2014-12-18 22:03:40

标签: r

我有一个包含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]))
}
}

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

是否可以重新编写该函数,以便b变为bx2.xlsx

2 个答案:

答案 0 :(得分:1)

我认为您只想解析参数名称

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)

答案 1 :(得分:1)

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

这通常会打开一堆蠕虫,因为对象在两个不同的位置可以有两个不同的名称。请考虑:您的全局环境中名为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