"剪切和粘贴"是一种严重有缺陷的反模式,不利于可重复的代码、分析或自动化(这些都是数据科学工作流程中所追求的)。这是一个入门级代码,可以让您获得数据元素(但仍需要一些“动手工作”)。"
library(xml2)
library(magrittr)
td <- tempfile("dir")
fils <- unzip(tempf.pptx, exdir = td)
charts <- fils[grepl("chart.*\\.xml$", fils)]
chart <- read_xml(charts[1])
现在我们已经找到并读取了一个图表XML文件,让我们看看能否确定它是哪种类型的图表:
(embedded_charts <- xml_find_all(chart, ".//c:chart/c:plotArea"))
(first_embed <- embedded_charts[1])
(xml_children(first_embed) %>%
xml_name() %>%
grep("Chart", ., value=TRUE) -> embed_kind)
现在我们可以尝试查找该图表的数据系列。
(target <- xml_find_first(first_embed, sprintf(".//c:%s", embed_kind)))
col_refs <- xml_find_all(target, ".//c:ser/c:tx/c:strRef")
(xml_find_all(col_refs, ".//c:f") %>%
sapply(xml_text) -> col_specs)
(xml_find_all(col_refs, ".//c:v") %>%
sapply(xml_text))
提取“X”元数据和数据:
x_val_refs <- xml_find_all(target, ".//c:cat")
(lapply(x_val_refs, xml_find_all, ".//c:f") %>%
sapply(xml_text) -> x_val_specs)
(lapply(x_val_refs, xml_find_all, ".//c:v") %>%
sapply(xml_double) -> x_vals)
提取“Y”元数据和数据:
y_val_refs <- xml_find_all(target, ".//c:val")
(lapply(y_val_refs, xml_find_all, ".//c:f") %>%
sapply(xml_text) -> y_val_specs)
(lapply(y_val_refs, xml_find_all, ".//c:v") %>%
sapply(xml_double) -> y_vals)
title_nodes <- xml_find_all(first_embed, ".//c:title")
(lapply(title_nodes, xml_find_all, ".//a:t") %>%
sapply(xml_text) -> titles)
与我创建docxtractr
软件包(用于从Word文档中获取表格)的动机不同,我并没有看到对上述习语的特别需求,因此我不确定在不久的将来是否会有一个软件包。