让我先介绍玩具数据集
@IBOutlet weak var incomeTableView : UITableView!
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView == incomeTableView {
let cell = tableView.dequeueReusableCell(withIdentifier: "incomeCell", for: indexPath) as! ViewControllerTableViewCell
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "expensesCell", for: indexPath) as! ViewControllerTableViewCell
return cell
}
}
和一个绘制6个散点图的玩具函数:每个library(magrittr)
library(purrr)
set.seed(13)
X<-matrix(rnorm(120),20,6) %>% data.frame %>% set_colnames(LETTERS[1:5])
列对应一个随机向量。
X
现在我为它添加点 - 点 - 点机制:
foo<-function(X){
win.graph(5,5)
par(mfcol=c(3,2))
par(mar=c(5,4,.1,.1))
X %>% iwalk(~plot(.x, rnorm(20), xlab=.y, ylab='Random'))
}
foo(X)
现在foo<-function(X,...){
win.graph(5,5)
par(mfcol=c(3,2))
par(mar=c(5,4,.1,.1))
X %>% iwalk(~plot(.x, rnorm(20), xlab=.y, ylab='Random',...))
}
会导致错误foo(X)
。 Error in plot.window(...) : invalid 'xlim' value
也会出现同样的错误。
为什么?为什么foo(X, pch=2)
似乎将通过iwalk
传递给...
的任何其他参数?如何更改上述代码以便能够通过xlim
传递其他参数?
修改
我尝试使用...
函数和tidyeval
运算符quos
方法:
!!!
现在,foo<-function(X, ...){
win.graph(5,5)
par(mfcol=c(3,2))
par(mar=c(5,4,.1,.1))
vars<-quos(...)
X %>% iwalk(~plot(.x, rnorm(20),xlab=.y, ylab='Random', !!! vars))
}
和foo(X)
都会产生foo(X, pch=2)
...
答案 0 :(得分:1)
我们可以执行此操作do.call
foo <- function(X, ...){
v1 <- c(...)
win.graph(5,5)
par(mfcol=c(3,2))
par(mar=c(5,4,.1,.1))
X %>%
iwalk(~ {args <- list(xlab = .y, ylab = 'Random')
args[names(v1)] <- v1
do.call(plot, c(list(x = .x, y = rnorm(20)), args))
})
}
foo(X)
foo(X, cex = 2)
foo(X, pch = 2)
foo(X, cex = 2, pch = 2)
foo(X, cex = 2, pch = 2, col = 2)
给出输出