2016-08-31 24 views
1

我工作在一個需要參數funs是的功能的串被施加到一組變量vars的功能。最簡單的做法似乎是使用dplyr的summarize_at和SE版本的funs函數。傳遞一個字符向量作爲玩意兒論據summarize_at

這適用於那些內置R中,但似乎並沒有與用戶定義函數的工作職能。它報告一個錯誤,它找不到用戶定義的函數。但是,「手動」完成後,summarize_at會起作用。

此功能是產生箱用於閃亮儀表板的較大功能的一部分。我寧願不要爲每種類型的盒子(每個函數和函數參數組合)都有(並且必須維護)不同的Shiny模塊。

一個最小的可重複的例子是以下:

# function to compute summary stat 
compute_box_value <- function(data, vars, funs) { 
    f = funs_(funs) 
    result <- data %>% 
    summarize_at(.cols = vars, .funs = f) 
} 

# simple user defined function that gets count of rows with certain values of x 
equals <- function(x, test_value) { 
    sum(x %in% test_value) 
} 

x <- data.frame(value = sample(1:5, 10, TRUE)) 

vars <- c("value") 

# this works 
print(compute_box_value(x, vars, "mean(., na.rm = TRUE)")) 

# this works 
summarize_at(x, vars, .funs = "equals", test_value = 1) 

# this doesn't work (error: couldn't find function equals) 
print(compute_box_value(x, vars, "equals(., test_value = 1)")) 

回答

1

您需要使用公式(~),而不是字符串:

print(compute_box_value(x, vars, ~equals(., test_value = 1))) 

其中給出:

# value 
#1  3 

documentation

這是最好的,因爲一個公式捕捉兩個 表達來評估和地方評估 發生環境使用的公式。如果表達式是數據框中的變量 和本地環境中的對象的混合,則這一點很重要:

+1

已經到了一半。該公式適用,但不適用於字符串。我發現在eval(parse())裏面嵌套字符串得到了剩餘的部分。標記爲答案。 – iacobus

+0

我應該添加該字符串是必需的,因爲它在我的實際代碼中嵌套在一個更大的函數中。我不直接調用'compute_box_value()',因此不能直接輸入參數作爲非字符串參數。 – iacobus

+0

@iacobus很高興幫助!隨意添加任何未涵蓋的附加信息,並可能使未來的讀者受益。您也可以將這些精度添加到您的問題。 –

相關問題