我正在尝试为API建立查询,并且我有一个函数,该函数是列表中的参数和值。如果我的某些参数具有多个值,我会遇到问题。例如,
paramlist1 <- list(
a = "1",
b = "2",
c = "3",
d = "4"
)
paste(names(paramlist1), "=", paramlist1, collapse = "&", sep="")
工作正常。但是我有一些参数可以包含多个值。例如,
paramlist2 <- list(
a = "1",
b = "2",
c = c("3", "4"),
d = c("5", "6")
)
我想返回2个字符串:
a=1&b=2&c=3&d=5
和a=1&b=2&c=4&d=6
也许我创建此参数列表的方法不是最好的。谢谢
答案 0 :(得分:5)
您需要重复较短的向量,使其长度与较长的向量相同。一种方法是将列表转换为data.frame,然后可以将apply
函数paste
应用于每一行:
myfun <- function(x) paste(names(x), "=", x, collapse="&", sep="")
apply(as.data.frame(paramlist2), 1, myfun)
答案 1 :(得分:1)
我们检查lengths
中的list
,得到max
的长度('mx'),其依据是附加了长度较短的paramlist2
元素,其中{ {1}},NA
到两列stack
,data.frame
和fill
元素以及上面与非NA相邻的元素(按'ind'分组)中,序列列,然后NA
对由“ n”分组的元素进行summarise
“ ind”和“ value”
paste
在另一个library(tidyverse)
fn1 <- function(lst) {
mx <- max(lengths(lst))
map(lst, `length<-`, mx) %>%
stack %>%
fill(values) %>%
group_by(ind) %>%
mutate(n = row_number()) %>%
group_by(n) %>%
summarise(val = paste(ind, "=", values, collapse= "&", sep=""))
}
fn1(paramlist2)
# A tibble: 2 x 2
# n val
# <int> <chr>
#1 1 a=1&b=2&c=3&d=5
#2 2 a=1&b=2&c=4&d=6
上,每个元素1、2和3具有不同的list
。
length
在这里,我们假设最后一个非NA元素会重复自身以调整长度
答案 2 :(得分:1)
这是另一种选择。看起来当您将列表转换为数据框时,它会为您填充额外的数字。然后我们只收集结果并汇总输出。
library(tidyverse)
paramlist2 <- list(
a = "1",
b = "2",
c = c("3", "4"),
d = c("5", "6")
)
paramlist2 %>%
as.data.frame() %>%
rownames_to_column("row") %>%
gather(col, num, -row) %>%
group_by(row) %>%
summarise(result = paste(col, "=", num, sep = "", collapse = "&"))
#> # A tibble: 2 x 2
#> row result
#> <chr> <chr>
#> 1 1 a=1&b=2&c=3&d=5
#> 2 2 a=1&b=2&c=4&d=6
由reprex package(v0.2.0)于2018-09-20创建。