R-根据'purrr';
我有下面的HTML输入列表。该列表具有嵌套结构-R-根据'purrr';,r,data-manipulation,purrr,R,Data Manipulation,Purrr,我有下面的HTML输入列表。该列表具有嵌套结构- 级别1包含输入的名称(例如,input1) 级别2包含有关每个输入的一些信息-名称,属性,子项 级别3分支出子级,这是一个长度为2的列表-第一个元素包含有关输入标签的信息,第二个元素包含有关输入类型的信息。因为我需要输入标签,所以我需要为每个输入提取这个列表的第一个元素 名单如下: library(purrr) inputs = list( input1 = list( name = 'div', attribs = li
input1
)名称
,属性
,子项
子级
,这是一个长度为2的列表-第一个元素包含有关输入标签的信息,第二个元素包含有关输入类型的信息。因为我需要输入标签,所以我需要为每个输入提取这个列表的第一个元素李>
名单如下:
library(purrr)
inputs = list(
input1 = list(
name = 'div',
attribs = list(class = 'form-group'),
children = list(list(name = 'label',
attribs = list(`for` = 'email'),
children = list('Email')),
list(
list(name = 'input',
attribs = list(id = 'email', type = 'text'),
children = list()))
)))
str(inputs)
List of 1
$ input1:List of 3
..$ name : chr "div"
..$ attribs :List of 1
.. ..$ class: chr "form-group"
..$ children:List of 2
.. ..$ :List of 3
.. .. ..$ name : chr "label"
.. .. ..$ attribs :List of 1
.. .. .. ..$ for: chr "email"
.. .. ..$ children:List of 1
.. .. .. ..$ : chr "Email"
.. ..$ :List of 1
.. .. ..$ :List of 3
.. .. .. ..$ name : chr "input"
.. .. .. ..$ attribs :List of 2
.. .. .. .. ..$ id : chr "email"
.. .. .. .. ..$ type: chr "text"
.. .. .. ..$ children: list()
我可以使用keep()
和has\u元素来执行此操作:
label = input %>%
map_depth(2, ~keep(., ~has_element(., 'label'))) %>%
map('children') %>%
flatten %>%
map('children') %>%
flatten
输出:
str(label)
List of 1
$ input1: chr "Email"
当我浏览purr
帮助页面时,keep
似乎是我想要的功能,但我仍然必须使用map
和flant
两次才能找到标签,这看起来很笨拙。所以我想知道是否有更直接的方法来实现相同的输出?与其说我对解决方案感兴趣,不如说我对处理类似嵌套列表的思考过程感兴趣。如果每个输入都具有相同的结构,那么您就不需要保留,它用于删除不满足某些条件的列表元素。相反,您可以像这样使用pulk
进行映射。当然,此方法会删除与每个输入相关的所有其他数据。如果最终目标是“矩形”,即在平面结构中获取每个输入的所有信息,则可能需要做一些不同的事情
库(purrr)
输入=列表(
输入1=列表(
名称='div',
attribs=list(class='formgroup'),
儿童=列表(
名单(
名称='标签',
attribs=list(`for`='email'),
子项=列表('电子邮件')
),
名单(
名单(
名称='输入',
attribs=list(id='email',type='text'),
children=list()
)
)
)
)
)
输入%>%
地图(~pluck(,“children”,1,“name”))
#>$input1
#>[1]“标签”
由(v0.3.0)于2019-06-14创建。如果每个输入都具有相同的结构,则不需要保留(用于删除不符合某些条件的列表元素)。相反,您可以像这样使用pulk
进行映射。当然,此方法会删除与每个输入相关的所有其他数据。如果最终目标是“矩形”,即在平面结构中获取每个输入的所有信息,则可能需要做一些不同的事情
库(purrr)
输入=列表(
输入1=列表(
名称='div',
attribs=list(class='formgroup'),
儿童=列表(
名单(
名称='标签',
attribs=list(`for`='email'),
子项=列表('电子邮件')
),
名单(
名单(
名称='输入',
attribs=list(id='email',type='text'),
children=list()
)
)
)
)
)
输入%>%
地图(~pluck(,“children”,1,“name”))
#>$input1
#>[1]“标签”
由(v0.3.0)于2019年6月14日创建
map(inputs, "children") %>% map_depth(2, "children")
输出:
$input1
$input1[[1]]
$input1[[1]][[1]]
[1] "Email"
$input1[[2]]
NULL
尝试:
输出:
$input1
$input1[[1]]
$input1[[1]][[1]]
[1] "Email"
$input1[[2]]
NULL
我注意到你的第二份“清单”是额外的金额,这是故意的吗?现在它是:{{n,a,c={{{n,a,c},{{n,a,c}}。你是说{{n,a,c={{n,a,c},{n,a,c}}}}吗?@Marian我不确定我是否理解注释中的符号,但实际列表包含n个输入,即input1,input2,…,inputN
,每个输入都有一个子列表,其结构与我所问的相同。对不起,我在我的帖子里没有说得更清楚。我注意到你的第二张“名单”是额外的金额,这是故意的吗?现在它是:{{n,a,c={{{n,a,c},{{n,a,c}}。你是说{{n,a,c={{n,a,c},{n,a,c}}}}吗?@Marian我不确定我是否理解注释中的符号,但实际列表包含n个输入,即input1,input2,…,inputN
,每个输入都有一个子列表,其结构与我所问的相同。很抱歉,我在帖子中没有说得更清楚。谢谢@Calum,这比我所做的要简单得多!我试过拔毛,但正在通过向量的索引。最后我用了弹拨(,“children”,1,“children”,1)
,因为这给了我标签的价值。谢谢@Calum,这比我刚才做的简单多了!我试过拔毛,但正在通过向量的索引。我最终使用了pulk(,“children”,1,“children”,1)
,因为这给了我标签的值。谢谢@Marian,我最终使用了pulk()
,但是如果我将结果展平两次,你的解决方案会给我相同的答案。谢谢@Marian,我最终使用了pulk())
但如果我将结果展平两次,您的解决方案将给出相同的答案。