在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])
你知道发生了什么吗?我认为它可能是函数返回结果的方式,但我可以找到一种方法来解决它。谢谢!
答案 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)
}