我有两个列表,一个包含不同长度的字符值(dat),另一个列表包含每个元素中的单个数值(delete_n)。
#include <iostream>
#include <map>
#include <string>
using namespace std;
class My_class
{
public:
void method_1() { wcout << "method_1\n"; }
void method_2() { wcout << "method_2\n"; }
void method_3() { wcout << "method_3\n"; }
};
auto method_name() -> string { return "method_3"; }
auto main() -> int
{
map<string, void (My_class::*)()> methods =
{
{ "method_1", &My_class::method_1 },
{ "method_2", &My_class::method_2 },
{ "method_3", &My_class::method_3 },
};
My_class example;
(example.*methods.at( method_name() ))();
}
&#34; delete_n&#34;中的元素与&#34; dat&#34;中的元素配对(delete_n [1]与dat [1]一起使用,依此类推)。 &#34; delete_n&#34;数字(0,2,1)告诉我每行需要删除的每个元素中有多少具体的列表项。
基于这个例子,我正在寻找一种解决方案,它将从dat [1]删除0项,删除&#34; Blue&#34;和&#34;格林&#34;来自dat [2]和&#34; Mazda&#34;来自dat [3]。
我首先尝试匹配元素编号,然后通过以下变体识别元素列表索引,但没有成功。 mapply可能更合适,但我还不清楚如何编写function()部分。
dat <- list(c("Apple", "Pear"), c("Red", "Blue", "Green"), c("Toyota", "Mazda"))
delete_n <- list(0, 2, 1)
答案 0 :(得分:5)
mapply(function (x, n) {
# x is an element of dat; n is an element of delete_n
x[seq_len(length(x)-n)]
}, dat, delete_n)
说明:
mapply
将函数应用于dat
和delete_n
的每个元素,一起使用(所有第一个元素,所有第二个元素等)。
seq_len(i)
生成向量1:i
,因此seq_len(length(x)-n)
会选择n
的所有x
个元素。{/ p>
答案 1 :(得分:3)
仅仅因为我不能在没有让head
工作的情况下放手一搏:
如果您将delete_n
更改为向量c(0,2,1)
(由于每个对应的dat
列表项只有一个值,因此可以轻松实现),您可以这样做:
Map(head, dat, n=-replace(delete_n, delete_n==0, -Inf))
答案 2 :(得分:3)
我喜欢mapply方法,但这对我来说似乎很自然(无论如何都会以负零点失败)。
mapply( head, dat, sapply(dat, length )- unlist(delete_n ))
#-------
[[1]]
[1] "Apple" "Pear"
[[2]]
[1] "Red"
[[3]]
[1] "Toyota"