我正在编写一个函数来创建提交和Jira问题之间的映射。不深入研究细节,它得到两个数据帧-一个包含提交散列和提交消息,第二个包含Jira问题。第三个参数是正则表达式,它告诉函数如何映射它们。
结果应该是包含两列的数据帧-commit
和issue
,其中包含找到的任何映射的哈希和颁发密钥。重复项(例如,两次相同的发行密钥)也应列出。
基于this question,我设法使用嵌套循环和表示映射是否存在的逻辑矩阵来错误的方式
connect_commits_to_issues <- function(commit_data, issue_data, regex) {
extracted <- commit_data %$% msg %>% str_extract_all(regex) %>% as.vector()
map <- sapply(extracted, function(commit) {
apply(issue_data, 1, function(r) any(r == commit))
}) %>% t()
result <- data.frame(commit = character(0), issue = character(0), stringsAsFactors = F)
for (i in 1:nrow(commit_data)) {
for (j in 1:nrow(issue_data)) {
if (map[i, j]) {
result[nrow(result) + 1,] <- list(commit = commit_data$commit[i],
issue = issue_data$key[j])
}
}
}
result
}
用法示例:
library('tidyverse')
valid_jira_df <- data.frame(key = c("ISSUE-13", "ISSUE-169"),
stringsAsFactors = FALSE)
valid_commit_df <- data.frame(commit = c("A", "B", "C"),
msg = c("ISSUE-13 Fix", "new feature", "Another ISSUE-13 fix"),
stringsAsFactors = FALSE)
result <- connect_commits_to_issues(valid_commit_df, valid_jira_df, "(ISSUE-\\d+)")
str(result)
#'data.frame': 2 obs. of 2 variables:
#$ commit: chr "A" "C"
#$ issue : chr "ISSUE-13" "ISSUE-13"
我知道此解决方案非常不实用。 可以以更智能(矢量化)的方式来完成吗?