2012-08-24 13 views
5

अग्रिम धन्यवाद, और खेद है कि अगर इस प्रश्न का उत्तर पहले दिया गया है - मैंने काफी व्यापक रूप से देखा है। मेरे पास एक डेटासेट है जिसमें समेकित जानकारी के साथ पंक्ति है, विशेष रूप से: नाम, रंग कोड, कुछ फ़ंक्शन अभिव्यक्ति। उदाहरण के लिए, एक मान हो सकता है:अक्षरों के वेक्टर से कार्यों की एक सूची बनाएं

लागत # FF0033 @ लॉग (x) +6।

मेरे पास जानकारी निकालने के लिए सभी कोड हैं, और मैं अभिव्यक्ति के वेक्टर के साथ समाप्त होता हूं जिसे मैं वास्तविक कार्यों की सूची में परिवर्तित करना चाहता हूं।

उदाहरण के लिए:

func.list <- list() 
test.func <- c("x","x+1","x+2","x+3","x+4") 

जहां test.func अभिव्यक्ति की वेक्टर है। क्या मैं चाहते हैं:

func.list[[3]] 

function(x){x+3} 

के बराबर होना करने के लिए मुझे पता है कि मैं का उपयोग कर एक समारोह बना सकते हैं:

somefunc <- function(x){eval(parse(text="x+1"))} 

एक समारोह में एक चरित्र मूल्य कन्वर्ट करने के लिए। समस्या तब आती है जब मैं कई कार्यों को करने के लिए कोशिश करता हूं और लूप करता हूं। बात नहीं बनी कुछ मैंने कोशिश की एक उदाहरण के लिए:

for(i in 1:length(test.func)){ 
    temp <- test.func[i] 
    f <- assign(function(x){eval(expr=parse(text=temp))}) 
    func.list[[i]] <- f 
} 

एक और पद के आधार पर (http://stats.stackexchange.com/questions/3836/how-to-create-a-vector-of -functions) मैं भी इस की कोशिश की:

makefunc <- function(y){y;function(x){y}} 
for(i in 1:length(test.func)){ 
    func.list[[i]] <- assign(x=paste("f",i,sep=""),value=makefunc(eval(parse(text=test.func[i])))) 
} 

निम्नलिखित में से कौन त्रुटि देता है: (expr, माहौल, enclos) eval में त्रुटि: ऑब्जेक्ट 'एक्स'

में लक्ष्य सूची लेने के लिए है नहीं मिला कार्यों का और jth फ़ंक्शन को डेटा.फ्रेम के जेथ कॉलम पर लागू करें, ताकि स्क्रिप्ट का उपयोगकर्ता निर्दिष्ट कर सके कि प्रत्येक कॉल को सामान्य कैसे करें स्तंभ शीर्षलेख द्वारा दी गई समेकित जानकारी के भीतर umn।

उत्तर

3

हो सकता है कि एक भी सामान्य समारोह के साथ अपनी सूची को प्रारंभ करें, और तब का उपयोग कर उन्हें अद्यतन:

body(foo) <- parse(text = "x+5") 
+0

धन्यवाद !! यह पूरी तरह से काम किया। एक बार एसओ मुझे ऐसा करने की इजाजत देने के बाद मैं अन्य उपयोगकर्ताओं के लिए अतिरिक्त उत्तर के रूप में कार्य को पूरा करने के लिए उपयोग किया गया कोड जोड़ूंगा। (और सभी टिप्पणियों/संपादनों/deletes/और whatnot के लिए खेद है - मैं स्पष्ट रूप से एसओ के लिए नया हूँ) – dayne

+0

@dayne मैं कहूंगा कि आप औसत ब्रांड नए एसओ आगंतुक की तुलना में चीजों का हाथ ठीक कर चुके हैं। – joran

2

:

foo <- function(x){x+3} 
> body(foo) <- quote(x+4) 
> foo 
function (x) 
x + 4 

अधिक विशेष रूप से, एक चरित्र से शुरू, तो आप शायद कुछ पसंद करते हैं चाहते हैं जोरन के जवाब पर जोड़ने के लिए, आखिर में यह काम करता है:

test.data <- matrix(data=rep(1,25),5,5) 
test.data <- data.frame(test.data) 

test.func <- c("x","x+1","x+2","x+3","x+4") 
func.list <- list() 

for(i in 1:length(test.func)){ 
    func.list[[i]] <- function(x){} 
    body(func.list[[i]]) <- parse(text=test.func[i]) 
} 

processed <- mapply(do.call,func.list,lapply(test.data,list)) 

धन्यवाद आगा में, जोरन

1

यह मैं क्या कर रहा है:

f <- list(identity="x",plus1 = "x+1", square= "x^2") 
funCreator <- function(snippet){ 
    txt <- snippet 
    function(x){ 
    exprs <- parse(text = txt) 
    eval(exprs) 
    } 
} 
listOfFunctions <- lapply(setNames(f,names(f)),function(x){funCreator(x)}) # I like to have some control of the names of the functions 
listOfFunctions[[1]] # try to see what the actual function looks like? 
library(pryr) 
unenclose(listOfFunctions[[3]]) # good way to see the actual function http://adv-r.had.co.nz/Functional-programming.html 
# Call your funcions 
listOfFunctions[[2]](3) # 3+1 = 4 
do.call(listOfFunctions[[3]],list(3)) # 3^2 = 9 
attach(listOfFunctions) # you can also attach your list of functions and call them by name 
square(3) # 3^2 = 9 
identity(7) # 7 ## masked object identity, better detach it now! 
detach(listOfFunctions) 
संबंधित मुद्दे