R 根据偏好组合样本中的数字
因此,我正在为一个棋盘游戏编写一个函数,我有一个示例“Rolls”,它由以下公式给出:R 根据偏好组合样本中的数字,r,sample,dice,R,Sample,Dice,因此,我正在为一个棋盘游戏编写一个函数,我有一个示例“Rolls”,它由以下公式给出: Rolls <- sample(1:6, 6, replace = TRUE) Rolls以下方法似乎有效。我试图用解释性名称编写函数,并以一种不难理解的方式完成每一步 其主要思想是使用内置的{utils}中的combn()来获得一个数据帧,其中包含“合并”的可能组合 从可能的组合中,我们只能合并1个模具一次。(如果您已经合并了第1个和第3个,您应该无法合并第3个和第4个,因为第3个已经被使用)。此步
Rolls <- sample(1:6, 6, replace = TRUE)
Rolls以下方法似乎有效。我试图用解释性名称编写函数,并以一种不难理解的方式完成每一步
其主要思想是使用内置的{utils}中的combn()
来获得一个数据帧,其中包含“合并”的可能组合
从可能的组合中,我们只能合并1个模具一次。(如果您已经合并了第1个和第3个,您应该无法合并第3个和第4个,因为第3个已经被使用)。此步骤在获取要删除的骰子的矢量中完成。最后,我们每2个骰子替换一个合并目标
我确信有更好、更有效的方法,我写不出来。还有其他方法,步骤(调用)要少得多,但我更喜欢让它更明确,这样您就可以了解正在发生的事情,如果您希望改进,请删除一些不必要的步骤或调整您喜欢的方式
(提示:如果您想一步一步地了解函数内部的情况,请使用debugonce(merge_dice_matching_nr)
在下次运行函数时进入该函数。在调试模式下,您可以缓慢地遍历函数,并在函数内部检查每个对象。)
库(dplyr)
掷骰子$orignial\u掷骰子
#> [1] 5 6 6 1 5 1
#>
#>$dice\u posite\u要移除
#> [1] 4 6
#>
#>$results\u合并
#> [1] 5 6 6 5 2
滚动%>%merge\u dice\u matching\u nr(合并=5)
#>$orignial_投掷
#> [1] 5 6 6 1 5 1
#>
#>$dice\u posite\u要移除
#>整数(0)
#>
#>$results\u合并
#>数字(0)
滚动%>%merge\u dice\u matching\u nr(merging=6)
#>$orignial_投掷
#> [1] 5 6 6 1 5 1
#>
#>$dice\u posite\u要移除
#> [1] 1 4 5 6
#>
#>$results\u合并
#> [1] 6 6 6 6
另一个允许数值向量参数的实现
这是另一个允许数字向量输入的选项,以便一次处理一个项目
merge_dice_matching_nr <- function(throw, merging, merged_results_only=FALSE) {
i_throw <- throw
for (i in 1:length(merging)) {
i_merging <- merging[i]
df_res <- get_data_frame_of_possible_combs(throw = i_throw, merging = i_merging)
vec_to_remove <- get_vec_of_dice_to_remove(df_res)
if (length(vec_to_remove)>0) {
# if there is nothing to merge, return results_merged as the original throw
res_merged <- append(i_throw[-vec_to_remove], rep(i_merging, length(vec_to_remove)/2))
} else {
res_merged <- i_throw
}
i_throw <- res_merged
}
if (merged_results_only) {
return(c(res_merged))
}
ret_list <- list("original_throw" = throw,
"dice_posit_to_remove" = vec_to_remove,
"results_merged" = res_merged)
return(ret_list)
}
set.seed(2)
(roll <- roll_dice()) %>%
merge_dice_matching_nr(merging = 2)
roll %>%
merge_dice_matching_nr(merging = c(2, 12, 10, 12, 24))
# $original_throw
# [1] 5 6 6 1 5 1
# $dice_posit_to_remove
# [1] 1 2
# $results_merged
# [1] 24
merge\u dice\u matching\n仅用于澄清:您的最终样本是4(=3+1)
、2
、1
、1
和4(已从第一轮开始)
。对吗?就是少了一个死亡。对吗?没错,其中一个4是我们推出的,另一个4是3+1的结果。是的,最终的样品根据添加的数量(长度)变小了,因为使用了两个数字来制作一个新的。我自己也试过,效果很好,这真是太棒了,非常感谢你,只是想知道你是否知道,否则,我会把代码弄得一团糟,看看我能不能做到,使用这段代码,我能做到这样的事情:尽可能多做5个,然后如果不能再做(或者根本没有),看看是否能做6个。这个代码可以吗?需要做一些小的修改。参见编辑回答合并处的顺序=c(2,12,10,12,24)重要吗?如果24是第一个,它会先尝试合并24,然后尝试做2,然后是12,等等?它一次只尝试合并2个骰子,所以顺序很重要。以任何方式合并到一个数字都是相当复杂的,因为有几种可能的合并方式。当然,这是可能的,但会大大增加函数的复杂性
set.seed(1212)
Rolls <- roll_dice()
Rolls
# [1] 2 1 5 4 6 4
Rolls <- Rolls %>% merge_dice_matching_nr(merging = 6, merged_results_only = T)
Rolls
# [1] 6 4 6 6
Rolls <- Rolls %>% merge_dice_matching_nr(5, merged_results_only = T)
Rolls
# [1] 6 4 6 6