使用purrr :: invoke()为函数提供不同的参数。

时间:2017-12-06 12:44:00

标签: r purrr

我想在R中使用不同的k(kmeans())值运行kmeans(x = iris[1:4], centers = k)函数。我知道如何使用dplyr或do.call()函数执行此操作,但是我无法使用purrr::invoke()(我很确定调用是此任务的正确函数)。我当然可以使用dplyr方法(参见this link),但令我很生气的是我无法使用purrr。

purrr::invoke()函数参考中,包含以下代码示例:

# Or the same function with different inputs:
invoke_map("runif", list(list(n = 5), list(n = 10)))
#> [[1]]
#> [1] 0.67176682 0.05861411 0.99706914 0.14903547 0.51855664
#> 
#> [[2]]
#>  [1] 0.84612005 0.71826972 0.24131402 0.54704337 0.83480182 0.02795603
#>  [7] 0.46938430 0.80568003 0.81405131 0.40391100
#> 

当我尝试使用kmeans执行此操作时,我会得到以下内容

> invoke(kmeans, list(list(centers = 1), list(centers = 2)), x = iris[1:4])
Error in sample.int(m, k) : invalid 'size' argument

我也试过

> invoke(kmeans, list(centers = 1:5), x = iris[1:4])
Error in (function (x, centers, iter.max = 10L, nstart = 1L, 
algorithm = c("Hartigan-Wong",  : must have same number of columns in 'x' and 'centers'

作为现实检查,我也尝试用paste

做类似的事情
> invoke(paste, list(list(sep = "a"), list(sep = "b")), "word1", "word2")
[1] "a b word1 word2"

我希望word1aword2word1bword2。我一直在阅读所有的函数引用,我目前还不确定如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

为什么“非常确定调用是此任务的正确功能”?

一个简单的map会:

set.seed(123) ; res1 <- invoke_map(kmeans, transpose(list(centers = 1:10)), x = iris[1:4])

set.seed(123) ; res2 <- map(1:10, kmeans, x = iris[1:4])

identical(res1, res2)
# [1] TRUE

答案 1 :(得分:0)

我弄清楚出了什么问题。首先,在这种情况下使用的正确函数是invoke_map()而不是invoke()。使用此功能时(也在函数参考-.-中指定),可以使用以下代码解决问题:

invoke_map(kmeans, list(list(centers = 1), list(centers = 2)), x = iris[1:4])

如果您想要多个中心,这可能会非常繁琐,所以我提出了以下解决方案,我非常满意。希望这可以帮助别人!

invoke_map(kmeans, transpose(list(centers = 1:10)), x = iris[1:4])