我有一个包含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
?
答案 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。