![](/img/trans.png)
[英]Pass vector of symbols as function argument and convert to character vector
[英]R: pass a vector of symbols into a function instead of a long argument list
我正在編寫一個使用.C()函數調用C代碼的R包。 我需要將50多個參數傳遞給.C(),這會嚴重影響我的代碼並容易出錯。 而不是打字
output <- .C("my_dynlib", arg2, arg3, arg4, arg5, arg6, ..., arg53)
我寧願有一個字符向量myNames
的附加參數發送到.C()並做類似的事情
f <- Vectorize(as.symbol, "x")
mySymbols <- f(myNames)
output <- .C("my_dynlib", mySymbols)
但這不是我想要的,因為mySymbols是一個列表。 有沒有辦法將一組參數緊湊地傳遞給我不想重寫的函數?
腳注:我猜你們中的一些人會建議用.Call,.External或Rcpp傳遞更復雜的參數,但這比我現在要處理的更徹底。
編輯:如果我希望myNames
指向s3或s4對象中的插槽,該怎么辦?
假設我想使用引用數據幀中類槽的符號。
> 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
我像@josilber一樣使用do.call,但do.call不識別符號
> do.call(print, mySymbols)
Error in (function (x, ...) : object 'y@.Data' not found
即使我可以手動使用這些符號。
> y@.Data
[[1]]
[1] 1 2 3 4
[[2]]
[1] 5 6 7 8
如果您有要傳遞給函數的對象列表,則可以使用do.call
函數執行此操作。 在您的情況下,聽起來像下面應該工作:
do.call(".C", c("my_dynlib", mySymbols))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.