使用rlang :: sym和感叹号将字符串传递给函数

时间:2018-09-23 20:12:08

标签: r string function

我有一个函数,试图对列进行一次热编码。我的问题似乎与R从函数传入列时如何解释列的字符串值有关。

function_notworking = function(data, col){

result = model.matrix(~col -1, data=data)
return(result)
}
 # doesnt work
function_notworking(data=iris, col='Species')

但是,如果我这样做:

model.matrix(~Species -1, data = iris) it does work just fine.

我还尝试研究添加rlang :: sym()和!!在'col'前面,但这似乎也不起作用。

function_notworking = function(data, col){
    col = rlang::sym(col) # 
    result = model.matrix(~col -1, data=data)
    #or result = model.matrix(~!!col -1, data=data)
    return(result)
    }

希望了解如何将这样的列名传递给函数而不会出现问题。

如果我在代码周围使用expr(),似乎!! rlang :: sym(col)代码可以完成工作,但我被卡住了。

2 个答案:

答案 0 :(得分:1)

我们需要做一个paste

function_working = function(data, col){

    model.matrix(as.formula(paste0("~ ", col,  -1)), data=data)
    # or create the formula with glue
    # model.matrix(formula(glue::glue("~{col} -1")), data = data) 

 }

function_working(data=iris, col="Species")

答案 1 :(得分:1)

尝试一下:

 static void Main(string[] args)
        {
           string fileName = System.IO.Path.Combine(@"C:\Users\Amen\Downloads", "ADMQH20X.DBC"); 
           string connectionString = $"Provider=VFPOLEDB;Data Source={fileName}";
           DataTable tbl = new DataTable(); 
           using(OleDbConnection con = new OleDbConnection(connectionString))
           using(OleDbCommand cmd = new OleDbCommand("select * from myTable", con))
           {
              con.Open();
              tbl.Load(cmd.ExecuteReader());
           }

           // do Something with datatable
        }