使用pmap_int在R中自定义函数

时间:2018-02-07 15:22:31

标签: r purrr

在R中,我创建了一个函数,在给定不同输入参数的情况下重复一系列计算。 我试图使用pmap_int()传递参数并从我的函数中获取结果。例如:

unique_id = seq(1:5)
pos = seq(1.1,1.5, by =  0.1)
cpc = seq(11:15)
clicks = seq(30,50, by =5)
times = seq(2,10, by =2)
df<-data.frame(unique_id,pos,cpc,clicks, times)

myfunction<-function(n_clicks, position, weighted_cpc){
 t<- df %>% 
 filter(clicks/times>n_clicks & pos<position & cpc>weighted_cpc) %>%
 summarise(n_kwd = length(unique_id)) 
 return(t)  
 }

test <- tibble(
 n_clicks = rep(c(0,10), each = 6),
 position = rep(seq(1.1,1.3,by= 0.1),4),
 weighted_cpc = rep(seq(0.10,0.20, by= 0.1),6))


test %>% 
  pmap_int(n_clicks,position,weighted_cpc, myfunction)

这会返回错误:&#34;错误:结果1不是长度为1的原子矢量&#34;。 但是,如果我将每个元素单独传递给myfunction,它会得到所需的结果。 EG:

myfunction(test$n_clicks[1],test$position[1],test$weighted_cpc[1])

你知道发生了什么吗?我认为它可能是函数返回结果的方式,但我可以找到一种方法来解决它。谢谢!

2 个答案:

答案 0 :(得分:0)

我不知道为什么这不起作用,但可以使用此代码修复:

test %>% 
  pmap(myfunction) %>% 
  unlist()
n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd 
    0     1     2     0     1     2     0     1     1     0     1     1 

答案 1 :(得分:0)

您没有正确地将参数传递给pmap_int。查看文档。它期望列表作为第一个参数(或tibble)而函数作为第二个参数。它不期望列名称。这个电话应该更像是

test %>% 
  pmap_int(myfunction)

如果您尝试使用列名,那么您需要在某种变异

中执行此操作
test %>% rowwise() %>%
  mutate(z=myfunction(n_clicks, position, weighted_cpc))

这里我使用rowwise(),因为你的函数没有矢量化。这也将返回添加新列的tibble,而不是返回值的前一版本。

此外,如果您使用_int版本,您的自定义函数应返回一个整数。你似乎正在回归。你的功能应该是

myfunction <- function(n_clicks, position, weighted_cpc){
  df %>% 
    filter(clicks/times>n_clicks & pos<position & cpc>weighted_cpc) %>%
    summarise(n_kwd = length(unique_id)) %>%
    pull(n_kwd)
}