我正在编写一个使用.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
答案 0 :(得分:2)
如果您有要传递给函数的对象列表,则可以使用do.call
函数执行此操作。在您的情况下,听起来应该如下:
do.call(".C", c("my_dynlib", mySymbols))