R: 将公式更新限制为512个字符

3
我正在尝试“粘贴”一种公式,用于在party的mob函数中使用。这意味着该公式将采用y~x1+...+xM | z1+..zN的形式。
我正在对y ~ x1+ ... + xM进行一些初步拟合,然后希望使用update()添加方程的条件部分。
以下是测试代码:
var1 <- 1:78
x1 <- paste("x", var1, sep="")
f1 <- paste("f", var1[1:10], sep="")                                

# use first 77 variables
fmla <- as.formula( paste("y ~ ", paste(x1[1:77], collapse=" + ", sep=""), sep=""))
fmla2 <- update(fmla, paste(". ~ . | ", paste(f1, collapse= " + "), sep=""))

# CHANGE x to all 78 variables
fmla <- as.formula( paste("y ~ ", paste(x1, collapse=" + ", sep=""), sep=""))
fmla2 <- update(fmla, paste(". ~ . | ", paste(f1, collapse= " + "), sep=""))

我在Windows和Linux(64位)上运行了此程序,但使用全部78个术语时(甚至使用超过78个术语),两者都失败了。错误消息显示Error in parse(text = x) : :1:514: unexpected ')'

如果更改x变量的名称长度,则会破坏具有更少变量的update(),但总是出现错误,指向超过512个字符。

是否有解决方法?

谢谢。


欢迎来到SO。感谢您展示样例代码和清晰的问题,我给您点赞。 - Andrie
3个回答

4

由于这似乎是一个字符串长度问题,因此可以简单地删除一些非必要的字符,例如加号周围的空格,即collapse= "+"

这样做有效:

fmla2 <- update(fmla, paste(". ~ . | ", paste(f1, collapse= "+"), sep=""))

fmla2
y ~ (x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + 
    x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + 
    x22 + x23 + x24 + x25 + x26 + x27 + x28 + x29 + x30 + x31 + 
    x32 + x33 + x34 + x35 + x36 + x37 + x38 + x39 + x40 + x41 + 
    x42 + x43 + x44 + x45 + x46 + x47 + x48 + x49 + x50 + x51 + 
    x52 + x53 + x54 + x55 + x56 + x57 + x58 + x59 + x60 + x61 + 
    x62 + x63 + x64 + x65 + x66 + x67 + x68 + x69 + x70 + x71 + 
    x72 + x73 + x74 + x75 + x76 + x77 | f1 + f2 + f3 + f4 + f5 + 
    f6 + f7 + f8 + f9 + f10)

1

感谢这些回复,但它们都忽略了使用update()函数的重要部分。

我需要使用update()函数,因为在粘贴公式的条件部分之前,第一个公式本身正在更新。

不能对公式使用as.character()函数,因为as.character()函数有一个约500个字符的限制。解决此问题的一种方法是,在第一个公式最终确定后,对其使用deparse()函数。

fmla.string <- gsub(" ","",paste(deparse(fmla), collapse=""), fixed=T)
fmla2 <- as.formula( paste(fmla.string, paste(f1, collapse= " + "), sep=" | "))

感谢 Duncan Murdoch 和 r-help 的关注。

0

这是解决方法。

var1 <- 1:78
x1 <- paste("x", var1, sep="")
f1 <- paste("f", var1[1:10], sep="")
as.formula(paste("y~",paste(x1,collapse="+"),"|",paste(f1,collapse="+")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接