假设我在R中有一个带有多个参数的函数,我想通过将一些参数设置为预先指定的值来将其减少为参数较少的函数.我试图找出最好的方法是在R.
例如,假设我有一个功能
f <- function(a,b,c,d){a+b+c+d}
Run Code Online (Sandbox Code Playgroud)
我想创建或找到一个函数partial,它将执行以下操作
partial <- function(f, ...){
#fill in code here
}
new_f <- partial(f, a=1, c= 2)
Run Code Online (Sandbox Code Playgroud)
new_f将是一个功能b和d和将返回1+b+2+d
在python我会这样做
from functools import partial
def f(a,b,c,d):
return a+b+c+d
new_f = partial(f, a=1, c= 2)
Run Code Online (Sandbox Code Playgroud)
我实际上反复这样做,所以我需要尽可能高效.谁能指出我最有效的方法呢?现在我能做的最好的就是
partial <- function(f, ...){
z <- list(...)
formals(f) [names(z)] <- z
f
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我更快的方式或最好的方法吗?这太慢了.
我有一个问题,ggplot2即显示超出规模中指定限制的数据.见下面的例子.如果限制设置为这些值,为什么我在图表中显示2009/01/01之前和2015/01/01之后的点?
library(ggplot2)
library(scales)
set.seed(100)
z <- seq.Date(as.Date("2008/12/1"), as.Date("2015/12/14"), "day")
l <- expand.grid(z, c("a", "b", "c"))
w <- data.frame(x= l[, 1], t = l[, 2])
w$val <- runif(nrow(w))
ggplot(data=w, aes_string(x="x", y="val"))+scale_x_date(
labels = date_format("%m/%d/%Y"),
limits= c(as.Date("2009/1/1"), as.Date("2015/1/1")),
breaks = "1 year")+
geom_point(aes(color = t))
Run Code Online (Sandbox Code Playgroud)
是否仍然可以按指定的方式保留中断/缩放,但只使用ggplot /删除数据超出限制而不预先过滤数据?这对我来说似乎是个错误.文档声明限制过滤器数据.

我遇到的问题是Stargazer函数将data.frame中的数据解释为latex命令.我想找到一种方法来抑制观星者的这个特征.见下文.
z <- c("Bank of America Corp",
"Citigroup Inc",
"JPMorgan Chase & Co",
"Morgan Stanley",
"Wells Fargo & Co")
s <- data.frame(z=z, l= c(100000, 25, 10000, 24, 100000))
library(stargazer)
stargazer(s, type = "text", summary = FALSE)
# prints out
==============================
z l
------------------------------
1 Bank of America Corp 100,000
2 Citigroup Inc 25
3 JPMorgan Chase Co
4 Morgan Stanley 24
5 Wells Fargo Co
------------------------------
Run Code Online (Sandbox Code Playgroud)
由于其在乳胶中的含义,这里的&符导致新的列被假定.我确认了这一点,因为更换和使用并使桌子正确打印出来.
z <- c("Bank of America Corp",
"Citigroup Inc",
"JPMorgan Chase and Co",
"Morgan …Run Code Online (Sandbox Code Playgroud) 如何使用data.table语法按组安装多个模型?我希望我的输出是一个data.frame,每个"按组"列有一列,每个模型适合一列.目前我可以使用dplyr包执行此操作,但不能在data.table中执行此操作.
# example data frame
df <- data.table(
id = sample(c("id01", "id02", "id03"), N, TRUE),
v1 = sample(5, N, TRUE),
v2 = sample(round(runif(100, max = 100), 4), N, TRUE)
)
# equivalent code in dplyr
group_by(df, id) %>%
do( model1= lm(v1 ~v2, .),
model2= lm(v2 ~v1, .)
)
# attempt in data.table
df[, .(model1 = lm(v1~v2, .SD), model2 = lm(v2~v1, .SD) ), by = id ]
# Brodie G's solution
df[, .(model1 = list(lm(v1~v2, .SD)), model2 = list(lm(v2~v1, .SD))), by …Run Code Online (Sandbox Code Playgroud) 我试图从函数列表和要传递给这些函数的参数列表创建新函数,但到目前为止我无法这样做.请参阅下面的示例.
fun_list <- list(f = function(x, params) {x+params[1]},
z = function(a, params) {a * params[1] * params[2]})
params_list <- list(f = 1, z = c(3, 5))
# goal is to create 2 new functions in global environment
# fnew <- function(x) {x+1}
# znew <- function(a) {a*3*5}
# I've tried
for(x in names(fun_list)){
force(x)
assign(paste0(x, "new"), function(...) fun_list[[x]] (..., params = params_list[[x]]))
}
Run Code Online (Sandbox Code Playgroud)
目标是动态地为任意函数和参数执行此操作.