在for循环中粘贴

时间:2014-09-18 16:08:27

标签: r

我想要使用包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也不起作用。

如果只是告诉我这是一个重复的问题,我们将不胜感激。 (有很多类似的问题,但他们没有帮助)。

2 个答案:

答案 0 :(得分:1)

这应该有效。除非你想在之后使用它们,否则没有真正的理由让ab长度为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。因此,ab在您的循环中是相同的,您实际上只需要一个。

或者你可以先建立名字

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元素列表portaportb中。那么这样的事情将是最简单的解决方案:

 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!