我希望能夠使用for()
循環來自動執行在修改它們的許多變量上運行的相同操作。用於()需要更改的變量
這裏是最簡單的例子,可以設計:
varToChange = list(1:10, iris$Species[1:10], letters[1:10]) # assume that it has many more than just 3 elements
varToChange
for (i in varToChange) {
if (is.character(y)) i <- as.integer(as.ordered(i))
if (is.factor(y)) i <- as.integer(i)
}
varToChange # <-- Here I want to see my elements as integers now
下面是促使我對這個問題實際的例子 - 摘自:Best way to plot automatically all data.table columns using ggplot2
在下面的函數
f <- function(dt, x,y,k) {
if (is.numeric(x)) x <- names(dt)[x]
if (is.numeric(y)) y <- names(dt)[y]
if (is.numeric(k)) k <- names(dt)[k]
ggplot(dt, aes_string(x,y, col=k)) + geom_jitter(alpha=0.1)
}
f(diamonds, 1,7,2)
,而不是粗暴地作爲一名程序員,我多次重複同一行,我寧願有一個循環爲我重複這一行。 事情是這樣的一個:
for (i in c(x,y,k)) {
if (is.numeric(i)) i <- names(dt)[i]
}
在C/C++,這將一直使用指針完成。在R - 這一切可能嗎?
更新:非常好的主意使用下面的地圖。然而,它並沒有在這個例子中
getColName <- function(dt, x) {
if (is.numeric(x)) {
x <- names(dt)[x]
}
x
}
f<- function(dt, x,y,k) {
list(x,y,k) <- Map(getColName, list(x,y,k), dt)
# if (is.numeric(x)) x <- names(dt)[x]
# if (is.numeric(y)) y <- names(dt)[y]
# if (is.numeric(k)) k <- names(dt)[k]
ggplot(dt, aes_string(x,y, col=k)) + geom_jitter(alpha=0.1)
}
f(diamonds, 1,7,2) # Brrr..