【发布时间】:2020-02-10 04:36:05
【问题描述】:
将 Python 函数转换为 R 我尝试在迭代使用 R 中的 strsplit() 拆分的值时添加更多数据。原始 Python 函数的返回值是列表列表,因此这在 R 中应该是相同的版本(向量的向量)。 Python函数是
anbaudauer = 12
planzen_list = [
'tomaten_6',
'karotten_4',
'paprika_7',
'erdbeeren_5',
'koriander_2',
'salat_3',
'zucchini_4',
'gurke_5',
'petersilie_2',
'radieschen_3'
]
def possible_combinations(values, target, with_replacement=True):
def sub_combinations(index, l, r, t, w):
if t == sum(filter(lambda i: isinstance(i, int), l)):
r.append(l)
elif t < sum(filter(lambda i: isinstance(i, int), l)):
return
for u in range(index, len(values)):
sub_combinations(u if w else (u + 1), l + [values[u].split('_')[0], int(values[u].split('_')[1])], r, t, w)
return r
return sub_combinations(0, [], [], target, with_replacement)
raw_combinations = possible_combinations(planzen_list, anbaudauer)
# returns [['tomaten', 6, 'tomaten', 6], ['tomaten', 6, 'karotten', 4, 'koriander', 2], ['tomaten', 6, 'karotten', 4, 'petersilie', 2], ...]
R函数的当前状态是
w <- c(
'tomaten_6',
'karotten_4',
'paprika_7',
'erdbeeren_5',
'koriander_2',
'salat_3',
'zucchini_4',
'gurke_5',
'petersilie_2',
'radieschen_3'
)
n <- length(w)
t <- 12
D <- list()
for (j in 0:n) D[[paste(0, j)]] <- list(c())
for (i in 1:t) D[[paste(i, 0)]] <- list()
for (j in 1:n) {
for (i in 1:t) {
D[[paste(i, j)]] <- do.call(c, lapply(0:floor(i/as.numeric(strsplit(w[j], '_')[[1]][2])), function(r) {
lapply(D[[paste(i-r*as.numeric(strsplit(w[j], '_')[[1]][2]), j-1)]], function(x) c(x, rep(strsplit(w[j], '_')[[1]][1]), r))
}))
}
}
D[[paste(t, n)]]
as.numeric(strsplit(w[j], '_')[[1]][2])我想在数字前加上蔬菜的名字。本质上,R 函数应该返回与 Python 函数相同的值。到目前为止,转换 R 函数的返回值非常棘手。基本上我试着把所有东西都拆开然后再缝合在一起。由于我很长时间没有使用 R,我确信有一种方便的方法可以获取与 Python 函数返回的数据相同的数据。
【问题讨论】:
-
strsplit是矢量化的。您可以直接使用strsplit(w, '_')而不是循环