我想要使用包data.frame
将多个XLConnect
导出到Excel。我使用for
循环执行此操作,在循环内有paste
函数,该函数提供sheet
名称,但我不知道如何构造data
名。
这就是我的意思。
我的data.frame
命名如下,
port.1a, port.1b, port.2a, port.2b ... port.10a, port.10b
到目前为止,我的代码看起来像这样,
library(XLConnect)
for (i in 1:10){
a[i] <- paste("port.",i,"a",sep="")
b[i] <- paste("port.",i,"a",sep="")
writeWorksheetToFile("wfe_bx3.xlsx", data=b[i], sheet=a[i])
}
我还没有理解port.1b
data.frame
s因为我对这部分有困难。显然,paste
会为character
返回data.frame
而不是data=b
,但cat
也不起作用。
如果只是告诉我这是一个重复的问题,我们将不胜感激。 (有很多类似的问题,但他们没有帮助)。
答案 0 :(得分:1)
这应该有效。除非你想在之后使用它们,否则没有真正的理由让a
和b
长度为10的向量。
for (i in 1:10){
a <- paste0("port.", i, "a")
b <- paste0("port.", i, "a")
writeWorksheetToFile("wfe_bx3.xlsx", data = as.name(b), sheet = a)
}
我复制/粘贴了您问题中的代码,而这些代码似乎没有使用&#34; b&#34;文件根本就是"a"
中的paste
。因此,a
和b
在您的循环中是相同的,您实际上只需要一个。
或者你可以先建立名字
a <- paste0("port.", 1:10, "a")
b <- paste0("port.", 1:10, "b") # assuming you wanted a "b" in here
for (i in 1:10){
writeWorksheetToFile("wfe_bx3.xlsx", data = as.name(b[i]), sheet = a[i])
}
这可能会更有效,在这个用例中肯定可以忽略不计。
在列表中执行操作的一个优点(根据我上面的评论)是您不必担心将字符串传递给期望data.frame的函数。我们假设您的data.frames位于两个10元素列表porta
和portb
中。那么这样的事情将是最简单的解决方案:
for (i in 1:10){
writeWorksheetToFile("wfe_bx3.xlsx", data = portb[[i]], sheet = names(portb)[i])
}
答案 1 :(得分:1)
正如@Gregor已经建议的那样,理想情况下你的对象已经在列表中了。但这是解决问题的可能方法:
## Reproducing use case ##
# Names of data.frames
obj.names = do.call("paste0", expand.grid("port.", 1:10, c("a", "b")))
# Create dummy objects
sapply(obj.names, assign, mtcars, envir = globalenv())
## Solution ##
# Gather objects in a list
objs = lapply(obj.names, get)
require(XLConnect)
writeWorksheetToFile("wfe_bx3.xlsx", data = objs, sheet = obj.names)
# NOTE: Many functions in XLConnect are vectorized!