R:将符号向量传递给函数而不是长参数列表

时间:2015-05-31 03:09:34

标签: r arguments symbols

我正在编写一个使用.C()函数调用C代码的R包。我需要将50多个参数传递给.C(),这会严重影响我的代码并容易出错。而不是键入

public Customer LoadById(int customerId)
{
    using (var context = new MyDbContext()) 
    {
        var myCustomer = context.Customers.Find(customerId);
        if (myCustomer != null)
        {
            // Filter orders.
            context.Entry(myCustomer)
                .Collection(c => c.Orders)
                .Query() 
                .Where(o => !o.IsDeleted)
                .Load();
        }
        return myCustomer;
    }
}

我宁愿使用其他参数的字符向量output <- .C("my_dynlib", arg2, arg3, arg4, arg5, arg6, ..., arg53) 发送到.C()并执行类似

的操作
myNames

但这并不是我想要的,因为mySymbols是一个列表。有没有办法将一组参数紧凑地传递给一个我不想重写的函数?

脚注:我猜你们中的一些人会建议用.Call,.External或者Rcpp传递更复杂的参数,但这比我现在想要处理的更彻底的改变。

修改:如果我希望f <- Vectorize(as.symbol, "x") mySymbols <- f(myNames) output <- .C("my_dynlib", mySymbols) 指向s3或s4对象中的广告位,该怎么办?

假设我想使用引用数据框中类槽的符号。

myNames

我像@josilber一样使用do.call,但是do.call并没有识别符号

> y = data.frame(a = 1:4, b = 5:8)
> myNames = paste("y@", slotNames(y), sep = "")
> mySymbols = lapply(myNames, as.symbol)
> str(mySymbols)
List of 4
 $ : symbol y@.Data
 $ : symbol y@names
 $ : symbol y@row.names
 $ : symbol y@.S3Class

即使我可以手动使用这些符号。

> do.call(print, mySymbols)
Error in (function (x, ...)  : object 'y@.Data' not found

1 个答案:

答案 0 :(得分:2)

如果您有要传递给函数的对象列表,则可以使用do.call函数执行此操作。在您的情况下,听起来应该如下:

do.call(".C", c("my_dynlib", mySymbols))