flextable 的给定单元格中的多个超链接
Multiple hyperlinks in a given cell of a flextable
我有一个数据框
df = data.frame("A" = c("a","b, c","c","d, e, f"), "B" = c(1,2,3,4), "link" = c("www.a.com", "www.b.com, www.c.com", "www.c.com", "www.d.com, www.e.com, www.f.com"))
A B link
a 1 www.a.com
b,c 2 www.b.com, www.c.com
c 3 www.c.com
d,e,f 4 www.d.com, www.e.com, www.f.com
我的格式是table
dt.ft <- regulartable(data = dt[, list(A, B, link)])
我想让 "A" 列中的值与 "link" 列中的相应值超链接,这是我在 @DavidGohel 的帮助下使用以下命令完成的
dt.ft <- flextable(data = df, col_keys = c("A", "B"))
dt.ft <- compose(x = dt.ft, j = 1, value = as_paragraph( hyperlink_text(x = A, url = link)))
d
效果很好。但如您所见,"A" 列中有逗号分隔值,"link" 列中有逗号分隔链接。如何制作相应的超链接并显示在同一单元格中
因此,flextable 会有一列 "A",第二行会有 "b" 和 "c" 超链接到 "www.b.com" 和 "www.c.com"
如果有任何其他替代方案来设计 DF,我可以这样做。它只是我有动态内容,它会因不同的值而异,即。我不知道事先链接的数量。
截至目前,这是不可能的。解决方法是创建具有相似内容的多行,但 link 和 link 值除外,然后合并这些行。这样你就会有多个 hyperlink 以垂直顺序排列合并行。
对于像这样的不规则结构,您需要一个特定的函数。
library(flextable)
df = data.frame("A" = c("a","b, c","c","d, e, f"),
"B" = c(1,2,3,4),
"link" = c("http://www.a.com", "http://www.b.com, http://www.c.com",
"http://www.c.com", "http://www.d.com, http://www.e.com, http://www.f.com"),
stringsAsFactors = FALSE)
ft <- flextable(data = df, col_keys = c("A", "B"))
multi_hyperlink_text <- function(labels, links){
out <- mapply(
function(text, url){
dat <- hyperlink_text(text, url = url)
dat <- split(dat, seq_along(text))
as_paragraph(list_values = dat)
},
text = strsplit(labels, split = ","),
url = strsplit(links, split = ","), SIMPLIFY = FALSE, USE.NAMES = FALSE
)
# the following is necessary to comply with expected
# flextable structure !
Reduce(append, out)
}
ft <- compose(x = ft, j = 2, value = multi_hyperlink_text(A, link))
ft <- color(x = ft, j = 2, color = "#0077CC")
ft <- add_footer_lines(x = ft, "column B is made of links")
ft
我有一个数据框
df = data.frame("A" = c("a","b, c","c","d, e, f"), "B" = c(1,2,3,4), "link" = c("www.a.com", "www.b.com, www.c.com", "www.c.com", "www.d.com, www.e.com, www.f.com"))
A B link
a 1 www.a.com
b,c 2 www.b.com, www.c.com
c 3 www.c.com
d,e,f 4 www.d.com, www.e.com, www.f.com
我的格式是table
dt.ft <- regulartable(data = dt[, list(A, B, link)])
我想让 "A" 列中的值与 "link" 列中的相应值超链接,这是我在 @DavidGohel 的帮助下使用以下命令完成的
dt.ft <- flextable(data = df, col_keys = c("A", "B"))
dt.ft <- compose(x = dt.ft, j = 1, value = as_paragraph( hyperlink_text(x = A, url = link)))
d
效果很好。但如您所见,"A" 列中有逗号分隔值,"link" 列中有逗号分隔链接。如何制作相应的超链接并显示在同一单元格中 因此,flextable 会有一列 "A",第二行会有 "b" 和 "c" 超链接到 "www.b.com" 和 "www.c.com"
如果有任何其他替代方案来设计 DF,我可以这样做。它只是我有动态内容,它会因不同的值而异,即。我不知道事先链接的数量。
截至目前,这是不可能的。解决方法是创建具有相似内容的多行,但 link 和 link 值除外,然后合并这些行。这样你就会有多个 hyperlink 以垂直顺序排列合并行。
对于像这样的不规则结构,您需要一个特定的函数。
library(flextable)
df = data.frame("A" = c("a","b, c","c","d, e, f"),
"B" = c(1,2,3,4),
"link" = c("http://www.a.com", "http://www.b.com, http://www.c.com",
"http://www.c.com", "http://www.d.com, http://www.e.com, http://www.f.com"),
stringsAsFactors = FALSE)
ft <- flextable(data = df, col_keys = c("A", "B"))
multi_hyperlink_text <- function(labels, links){
out <- mapply(
function(text, url){
dat <- hyperlink_text(text, url = url)
dat <- split(dat, seq_along(text))
as_paragraph(list_values = dat)
},
text = strsplit(labels, split = ","),
url = strsplit(links, split = ","), SIMPLIFY = FALSE, USE.NAMES = FALSE
)
# the following is necessary to comply with expected
# flextable structure !
Reduce(append, out)
}
ft <- compose(x = ft, j = 2, value = multi_hyperlink_text(A, link))
ft <- color(x = ft, j = 2, color = "#0077CC")
ft <- add_footer_lines(x = ft, "column B is made of links")
ft