Use a data frame of functions to calculate values using specific columns in another data frame
I would suggest you merge your data.frames so you can split the data per function:

mg &lt;- merge(funcs_df, tree_df)
sp &lt;- split(mg, mg$funcs)

print(sp)
# $func1
#   spcd region funcs dbh  ht
# 2  122   OR_W func1  12 101
# 3  122   OR_W func1  21  76
# 5  141   OR_W func1  15 100
# 6  141   OR_W func1  10  88
# 
# $func2
#   spcd region funcs dbh  ht
# 1  122   OR_E func2  11  99
# 4  141   OR_E func2  13 121


Then, you just have to call each function once (since you confirmed the functions are vectorized):

cvts_list &lt;- Map(function(fun, x) fun(x$dbh, x$ht),
                 fun = mget(names(sp)), x = sp)

print(cvts_list)
# $func1
# [1] 245 517 325 188
# 
# $func2
# [1] 22 48


and stack the results into a new column, using unsplit:

mg$cvts &lt;- unsplit(cvts_list, mg$funcs)

print(mg)
#   spcd region funcs dbh  ht cvts
# 1  122   OR_E func2  11  99   22
# 2  122   OR_W func1  12 101  245
# 3  122   OR_W func1  21  76  517
# 4  141   OR_E func2  13 121   48
# 5  141   OR_W func1  15 100  325
# 6  141   OR_W func1  10  88  188