R为什么do.call与直接计算不匹配?

时间:2018-07-16 19:13:13

标签: r do.call

在做一些更复杂的事情的过程中,我发现了以下内容: 如果我使用do.call将数字矢量转换为列表,那么我将获得与应用函数不同的值,而且不确定为什么。

static void Main(string[] args)
{
    string searchText = "Life-Span Development 16E 99 Subject Index";

    using (Entities db = new Entities())
    {
        var result = db.titles
                    .Join(db.assets,
                            p => p.tid,
                            e => e.tid,
                            (p, e) => new {
                                 title = p.title1,
                                 fileName = e.filename
                            });               

        var searchTextArray = searchText.ToLower().Split(' ');
        result = result.Where(t => searchTextArray.Any(s => t.title.ToLower().Contains(s)));

        foreach(var item in result)
        {
            Console.WriteLine(string.Format("Title = {0} and finename = {1}", item.title, item.fileName));
        }
    }

    Console.ReadKey();
}

为什么?

注意:我正在尝试使用功能名称向量来运行各种功能。这适用于do.call,但前提是我从do.call获得正确的输出。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

所以do.call期望args参数是参数列表,因此从技术上讲,我们希望传递list(x = x)

> set.seed(123)
> x <- rnorm(10)
> median(x)
[1] -0.07983455
> do.call(median,list(x = x))
[1] -0.07983455
> do.call(median,as.list(x))
[1] -0.5604756

在向量as.list上调用x会将其转换为长度为10的列表,就好像您要调用median并将其传递10个单独的参数一样。但实际上,我们只传递了一个x。因此最后,它仅获取向量的第一个元素,并将其传递给参数x