2017-07-15 30 views
0

好吧,假設我創建了一個非常簡單的柱狀圖與我的功能:在R中,我可以在不指定`main =`的情況下更改直方圖標題嗎?

hist(my.fun(100)) 

我的直方圖顯示Histogram of my.fun(100)標題。這對我來說非常好!我喜歡R自動識別my.fun(100)並將其放入標題和標籤中的方式。

但後來我做複雜的計算,他說:

n <- my.complex.algo.that.compute.size(args) 
hist(my.fun(n)) 

這一次,標題顯示Histogram of my.fun(n)。這並沒有提供多大的線索n。我知道n將被評估爲某個整數,假設對於此次運行n == 42,我希望看到直方圖的標題顯示爲Histogram of my.fun(42)

這是可能的沒有指定我自己的標題(沒有main=paste(...))。我已經嘗試這些和失敗:

hist(my.fun(`n`)) 
hist(my.fun(eval(n))) 
+6

「我可怎麼辦R中的東西,而無需使用提供這樣做的論據?「是一個非常奇怪的問題。顯然你的嘗試失敗了。在'hist'的幫助頁面上,它說你用參數'main'改變標題。如果你不喜歡那樣,你可以編寫你自己的hist函數來做你想做的事情。 –

+2

如果你解釋爲什麼,也許我們會不那麼困惑?特別是,「(沒有main = paste(...))」,爲什麼? – rosscova

+0

我發現R有非常奇怪的評估方面(與其他通用語言如C,Python相比)。對於這一個,我很好奇爲什麼'hist()'可以捕獲my.fun(100)'表達式,並且在後期將它變成一個字符串! – neizod

回答

0

當我擡頭看,並從hist源代碼中學習,我可以說這是不可能的,當hist被稱爲頂層函數。

xname <- paste(deparse(substitute(x), 500), collapse = "\n") 

deparse(substitute(x))試圖抓住(尚未評估)表達式樹,並把它轉換成字符串:因爲該行中的源代碼。這意味着我輸入作爲hist函數的第一個參數的任何表達式,它將立即變爲一個字符串,而不進行任何評估。

爲了達到這個目的,我需要在表達式樹的某個葉子上強制執行評估。這(幸運的是,我只是學習一下吧)與substitute來完成,並使用do.call通過評估的表達式樹作爲論據hist功能:

n <- my.complex.algo.that.compute.size(user.args) # suppose this calc return 42 
evaluated.arg <- substitute(my.fun(x), list(x=n)) # now this will be my.fun(42) 
do.call(hist, list(evaluated.arg)) 
3

如果限制你直方圖化到一個參數的函數的東西,n,那麼你可以這樣做:

nhist = function(f,n){ 
    hist(f(n), 
    main=paste0(
    "Histogram of ", 
    deparse(substitute(f), 500)," 
    (",n,")", collapse = "\n"))} 

,你稍微調用不同:

Z=100 
nhist(runif, Z) 

你要通過fn分開,因爲沒有辦法hist能找出被傳遞給f

相關問題