【发布时间】:2021-03-31 22:11:25
【问题描述】:
在将数值向量与单个值进行比较时,Rcpp 中的 == 运算符按预期工作。 IE。向量的每个元素都与值进行比较,并返回一个逻辑向量。例如,考虑以下行为符合预期:
library(Rcpp)
cppFunction('
CharacterVector test_vals(NumericVector x) {
if (is_true(any(x == 3))) return ("Values include 3");
return ("3 not found");
}')
test_vals(1:2)
# [1] "3 not found"
test_vals(1:5)
# [1] "Values include 3"
但是,如果我尝试将字符向量与字符标量进行比较,它似乎只测试了向量的第一个元素:
cppFunction('
CharacterVector test_names(NumericVector x) {
CharacterVector y = x.attr("names");
if (is_true(any(y == CharacterVector::create("foo")))) return ("Names include foo");
return ("foo not found");
}')
test_names(c(a=1, b=2, foo=3))
# [1] "foo not found"
test_names(c(foo=3, a=1, b=2))
# [1] "Names include foo"
我知道比较两个相同长度的字符向量似乎以向量化的方式工作,正如预期的那样:
cppFunction('
CharacterVector test_names(NumericVector x) {
CharacterVector y = x.attr("names");
CharacterVector foo(x.size());
foo.fill("foo");
if (is_true(any(y == foo))) return ("Names include foo");
return ("foo not found");
}')
test_names(c(a=1, b=2, foo=3))
# [1] "Names include foo"
test_names(c(foo=3, a=1, b=2))
# [1] "Names include foo"
test_names(c(a=1, b=2))
# [1] "foo not found"
这是否意味着字符向量与单个值的比较尚未在 Rcpp 中实现,还是我只是想念如何做到这一点?
【问题讨论】:
-
好问题。看起来
NumericVector有合适的opeator=()但CharacterVector可能没有(因为角色通常是不同的鱼牛)。我们可能会添加它;与此同时,您可能可以为自己编写一个“手动”处理两个向量的小帮手。 -
所以说白了,你想要一个'contains()'操作符,它接受一个字符串向量和一个字符串,返回一个布尔值?由于此处的多对一映射,将其表述为
==对我的阅读来说有点“偏离”。您真的在这里查看集合运算符,对吗? (我和你一样,std::vector<>是最好的容器......) -
是的 - 这正是我正在寻找的
-
我认为我们应该看看其他东西——想想
std::vector<std::string>并将其交给已经执行此操作的 STL... -
很高兴这有帮助。更多地考虑缺乏
==支持:我们通常不会像 R 那样“回收”(某些语言称之为“广播”)。所以“多对一”的比较有点未知。