2017-08-27 90 views
2

首先,我推測,因爲這個問題已經在另一個頁面回答,例如 How do I use a macro variable in R? (Similar to %LET in SAS)Pass string as name of attached data column name但我已經閱讀了他們,觀看Youtube教程,認爲函數命令是我想要的,我只是不能讓它工作。我對整體編程非常陌生,對R來說只有幾天的時間,而且由於缺乏經驗或對從哪裏開始的理解,我相信我錯過了一些東西。R SAS宏像表達式

在SAS我會做這樣的

%Macro DV (var1, var2); 
Proc mixed … 
Model &var1 = &var2 … 
Data &var1_&var2… 
%mend DV; 
%DV (VAS, Hyd) 
%DV (SOM, Hyd) 
%DV (GAS, Hyd) 

的變量(例如,VAS,路政署)那我打電話是列標籤,它們會叫,在混合模型分析柱並且,使用更多的代碼,數據集將根據分析的變量以文件名導出。 我不想在R中執行lmer我使用的是rmcorr軟件包,並且想要更改分析的列。 原來的表達,這樣的作品,看起來像

VASCor.rmc <- rmcorr(participant = Subject, measure1 = Hyd, measure2 = VAS, dataset = mydata) 
plot(VASCor.rmc,mydata, overall = T, lty=1, xlab = "Hyd", ylab = "VAS") 

的工作數據集可以在下面找到。因此,只處理第一個表達式,我嘗試了以下內容,認爲var1和var2會插入到正確的位置,但最終會出現錯誤「object'var2'not found」。

Allrmcorr <- function(var1, var2){ 
var1.var2.rmc <- rmcorr(participant = Subject, measure1 = var2, measure2 = var1 , dataset = Results2) 
} 
Allrmcorr("VAS","Hyd") 
Allrmcorr("VAS","Hyd") 

我已經嘗試了一些表情和大概花了足夠長的時間試圖弄明白到剛剛改寫了表達的時候,我不接近,但固執我想知道下一個更好的辦法時間。任何幫助將不勝感激。

mydata <- data.frame(
Subject = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3), 
Time = c(1:5,1:5,1:5), 
VAS= runif(15), 
Hyd =runif(15), 
GAS= runif(15) 
) 
+1

不知道任何關於'rmcorr'函數,它看起來像你只需要'返回'你創建的變量。將'return(var1.var2.rmc)'添加到函數的末尾,您應該看到該值。然後,您會創建像vas.hyd這樣的新變量。rmc < - Allrmcorr(「VAS」,「Hyd」)' – brittenb

+0

在這種情況下,不需要返回語句。 R總是返回函數中的最後一個值。 –

回答

1

我不熟悉rmcorr,但你的問題源於你的函數如何處理輸入參數。在你的代碼仔細看看:

rmcorr(participant = Subject, measure1 = var2, measure2 = var1 , dataset = Results2)

需要measure1measure裸名輸入(所以,語言元素,而不是一個字符串像"var1"(引號)

當你通過。字符串文字的功能與Allrmcorr("VAS","Hyd"),rmcorr希望光禿禿的名字它在他們評估框dataset。所有這可能是一個複雜的假如你是新來的R.我推薦閱讀「前進如果你想深入探討這個話題(特別是關於職能和懶惰評估的章節),你可以選擇Hadley Wickham的「R」。

一個簡單的解決問題的方法 - 這是類似如何宏觀變量工作 - 正在建設中的表達式作爲一個字符串,然後評估它:

Allrmcorr <- function(var1, var2, dat){ 
    ds <- dat 
    eval(parse(text = (sprintf(
    "rmcorr(participant = Subject, measure1 = %s, measure2 = %s, dataset = ds)", var1, var2 
)))) 
} 

Allrmcorr("VAS", "Hyd", mydata) 

這有嚴重的缺點,當涉及到性能和代碼的可調試性;但是,由於rcmorr的內部實現有點奇怪,我無法找到更好的解決方案來解決您的問題。

+0

'get()'可能不起作用,因爲變量本身在全局環境中不存在。 'rmcorr'方法引用* dataset * arg中的列。 – Parfait

+0

嗯,它不一定在_global_環境上班,但我也不是100%肯定會在這裏工作。也許我們可以玩一些可重複的例子。 'get(var2,Results2)'或簡單的'Result2 [[var2]]'應該可以工作,但這有點麻煩。 –

+1

它可能不是OP的錯,但是包的作者。看到他們的[源代碼](https://github.com/cran/rmcorr/blob/master/R/rmcorr.R),params預期爲*符號*類型,然後'eval()'返回值。大多數函數通常會接收字符串參數以允許OP要求的動態特性。我可能會提出有關其回購的問題。 – Parfait