purrr函数内的点 - 点机制

时间:2017-11-23 13:31:10

标签: r purrr

让我先介绍玩具数据集

@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

现在我为它添加点 - 点 - 点机制:

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) ...

1 个答案:

答案 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)

给出输出

enter image description here